উত্তর:
আপনি মূলত সি ++ 03 স্ট্যান্ডার্ডের §7.3.1.1 / 2 বিভাগটি উল্লেখ করছেন,
নাম স্থানের সুযোগে বস্তু ঘোষণার সময় স্থিতিশীল কীওয়ার্ডের ব্যবহার অবমূল্যায়ন করা হয়; নামবিহীন-নেমস্পেস একটি উন্নত বিকল্প সরবরাহ করে।
নোট করুন যে এই অনুচ্ছেদটি ইতিমধ্যে সি ++ 11-এ সরানো হয়েছে। স্ট্যান্ডার্ড অনুযায়ীstatic ফাংশনগুলি আর অবচিত হয় না!
তবুও, নামবিহীন নেমস্পেসগুলি স্থির কীওয়ার্ডের চেয়ে উচ্চতর, মূলত কারণ কীওয়ার্ডটি staticকেবলমাত্র ভেরিয়েবলের ঘোষণাপত্র এবং ফাংশনগুলিতে প্রয়োগ হয়, ব্যবহারকারী-সংজ্ঞায়িত প্রকারের ক্ষেত্রে নয় ।
নিম্নলিখিত কোডটি সি ++ এ বৈধ
//legal code
static int sample_function() { /* function body */ }
static int sample_variable;
তবে এই কোডটি বৈধ নয়:
//illegal code
static class sample_class { /* class body */ };
static struct sample_struct { /* struct body */ };
সুতরাং সমাধানটি হল, নামবিহীন-নেমস্পেস যা এটি,
//legal code
namespace
{
class sample_class { /* class body */ };
struct sample_struct { /* struct body */ };
}
আশা করি এটি ব্যাখ্যা করবে যে কেন unnamed-namespaceতার চেয়ে উচ্চতর static।
এছাড়াও, নোট করুন যে স্ট্যাটিক কীওয়ার্ডের ব্যবহার নাম-স্থান স্কোপের (স্ট্যান্ডার্ড অনুসারে) অবজেক্টকে ঘোষণা করার সময় অবচিত করা হয়।
deprecatedমন্তব্যটি সর্বশেষ সি ++ 0x এফসিডি (এন 3225) থেকে সরানো হয়েছে।
.cppএকই নামের সাথে একটি শ্রেণির সংজ্ঞা দিচ্ছে।
এটি সম্পর্কিত একটি আকর্ষণীয় সমস্যা রয়েছে:
ধরুন আপনি staticকীওয়ার্ড ব্যবহার করেছেন বা নামবিহীন namespaceকিছু ফাংশনটি মডিউলটির অভ্যন্তরীণ করতে (অনুবাদ ইউনিট) তৈরি করতে, যেহেতু এই ফাংশনটি মডিউল দ্বারা অভ্যন্তরীণভাবে ব্যবহার করা হয়েছে এবং এর বাইরে অ্যাক্সেসযোগ্য নয়। (বেনামে namespaceফাংশন ছাড়াও অভ্যন্তরীণভাবে ডেটা এবং সংজ্ঞা সংজ্ঞা দেওয়ার সুবিধা রয়েছে)।
সময়ের সাথে সাথে আপনার মডিউল বাস্তবায়নের উত্স ফাইলটি বড় আকারে বৃদ্ধি পাবে এবং আপনি এটিকে কয়েকটি পৃথক উত্স ফাইলে বিভক্ত করতে চাইবেন যা কোডটি আরও ভালভাবে সংগঠিত করার জন্য, সংজ্ঞাগুলি আরও দ্রুত সন্ধান করার জন্য এবং স্বাধীনভাবে সংকলন করার অনুমতি দেবে।
তবে এখন আপনি একটি সমস্যার মুখোমুখি staticহয়েছেন : সেই ফাংশনগুলি আর মডিউলে থাকতে পারে staticনা , কারণ প্রকৃতপক্ষে মডিউলটিকে নয় , উত্স ফাইলটিতে (অনুবাদ ইউনিট)। আপনি তাদের staticমডিউলটির অন্যান্য অংশ (অবজেক্ট ফাইল) থেকে অ্যাক্সেস করার অনুমতি না দেওয়ার জন্য বাধ্য করতে বাধ্য করেছেন । তবে এর অর্থ হ'ল এগুলি আর মডিউলটিতে গোপন / গোপনীয় নয়: বাহ্যিক সংযোগ থাকার কারণে এগুলি অন্যান্য মডিউল থেকে অ্যাক্সেস করা যায়, যা আপনার আসল উদ্দেশ্য ছিল না ।
নামহীন namespaceএই সমস্যাটিও সমাধান করতে পারে না, কারণ এটি নির্দিষ্ট উত্স ফাইল (অনুবাদ ইউনিট) এর জন্যও সংজ্ঞায়িত এবং বাইরে থেকে অ্যাক্সেস করা যায় না।
এটা তোলে যদি এক নির্দিষ্ট পারে যে কিছু মহান হবে namespaceহয় privateযে, যাই হোক না কেন এটা সংজ্ঞায়িত করা হয়, মডিউল এটা জন্যে দ্বারা অভ্যন্তরীণভাবে ব্যবহৃত হবে বোঝানো হয়। তবে অবশ্যই সি ++ এর "মডিউল" এর মতো ধারণা নেই, কেবল "অনুবাদ ইউনিট", যা উত্স ফাইলগুলিতে দৃ tight়ভাবে আবদ্ধ।
সি ++ স্ট্যান্ডার্ড 7.3.1.1 বিভাগে পড়ে আছে নামহীন নামের স্থান, অনুচ্ছেদ 2:
নাম স্থানের সুযোগে অবজেক্টগুলি ঘোষণার সময় স্থির কীওয়ার্ডের ব্যবহার অবমূল্যায়ন করা হয়, নামবিহীন-নেমস্পেস একটি উচ্চতর বিকল্প সরবরাহ করে।
স্ট্যাটিক কেবল ঘোষণা, টাইপ না করে অবজেক্ট, ফাংশন এবং বেনামী ইউনিয়নের নামগুলিতে প্রযোজ্য।
staticকাজ করে।