স্ট্যাটিকের চেয়ে নামবিহীন নেমস্পেসের শ্রেষ্ঠত্ব?


129

কীভাবে নামবিহীন নেমস্পেসগুলি staticকীওয়ার্ডের চেয়ে উচ্চতর ?


তবে স্ট্যান্ডার্ড কমিটি অনুসারে নামবিহীন নেমস্পেসগুলি নামস্থান-স্ট্যাটিকের জন্য পর্যাপ্ত প্রতিস্থাপন নয় । এখনও কয়েকটি উদাহরণ রয়েছে যেখানে নামবিহীন নেমস্পেসগুলি ব্যর্থ হয় এবং কেবলমাত্র staticকাজ করে।
কিংবদন্তি

উত্তর:


133

আপনি মূলত সি ++ 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

এছাড়াও, নোট করুন যে স্ট্যাটিক কীওয়ার্ডের ব্যবহার নাম-স্থান স্কোপের (স্ট্যান্ডার্ড অনুসারে) অবজেক্টকে ঘোষণা করার সময় অবচিত করা হয়।


11
আরও সাধারণভাবে, একটি নামবিহীন নেমস্পেস বাহ্যিক সংযোগের অনুমতি দেয়। এটিই স্থানীয়-অনুবাদ-ইউনিট শ্রেণীর ঘোষণা সক্ষম করে। এটি উদাহরণস্বরূপ বাহ্যিক সংযোগ স্ট্রিংটিকে টেমপ্লেট আর্গুমেন্ট হিসাবে ব্যবহার করার অনুমতি দেয়।
চিয়ার্স এবং এইচটিএইচ - আলফ

10
ফ্রেড নুরকের আপনার উত্তরের অন্যটিতে যেমন উল্লেখ করা হয়েছে, দেখে মনে হচ্ছে এই deprecatedমন্তব্যটি সর্বশেষ সি ++ 0x এফসিডি (এন 3225) থেকে সরানো হয়েছে।
ম্যাথিউ এম।

36
আপনি নিজের প্রশ্নের জবাব দিচ্ছেন এবং নিজেকে ধন্যবাদ বলছেন: -ও
মনপ্রীত সিংহ

11
কেবল সিপিপিতে শ্রেণীর সংজ্ঞা দেওয়া থেকে কোনও পার্থক্য হবে (কোনও নামবিহীন নাম নেই, কোনও স্থির নয়)?
লুচিয়ান গ্রিগোর

6
@ লুচিয়ানগ্রিগোর লিঙ্কিং ঝামেলা 2 ক্ষেত্রে .cppএকই নামের সাথে একটি শ্রেণির সংজ্ঞা দিচ্ছে।
Xaqq

8

এটি সম্পর্কিত একটি আকর্ষণীয় সমস্যা রয়েছে:

ধরুন আপনি staticকীওয়ার্ড ব্যবহার করেছেন বা নামবিহীন namespaceকিছু ফাংশনটি মডিউলটির অভ্যন্তরীণ করতে (অনুবাদ ইউনিট) তৈরি করতে, যেহেতু এই ফাংশনটি মডিউল দ্বারা অভ্যন্তরীণভাবে ব্যবহার করা হয়েছে এবং এর বাইরে অ্যাক্সেসযোগ্য নয়। (বেনামে namespaceফাংশন ছাড়াও অভ্যন্তরীণভাবে ডেটা এবং সংজ্ঞা সংজ্ঞা দেওয়ার সুবিধা রয়েছে)।

সময়ের সাথে সাথে আপনার মডিউল বাস্তবায়নের উত্স ফাইলটি বড় আকারে বৃদ্ধি পাবে এবং আপনি এটিকে কয়েকটি পৃথক উত্স ফাইলে বিভক্ত করতে চাইবেন যা কোডটি আরও ভালভাবে সংগঠিত করার জন্য, সংজ্ঞাগুলি আরও দ্রুত সন্ধান করার জন্য এবং স্বাধীনভাবে সংকলন করার অনুমতি দেবে।

তবে এখন আপনি একটি সমস্যার মুখোমুখি staticহয়েছেন : সেই ফাংশনগুলি আর মডিউলে থাকতে পারে staticনা , কারণ প্রকৃতপক্ষে মডিউলটিকে নয় , উত্স ফাইলটিতে (অনুবাদ ইউনিট)। আপনি তাদের staticমডিউলটির অন্যান্য অংশ (অবজেক্ট ফাইল) থেকে অ্যাক্সেস করার অনুমতি না দেওয়ার জন্য বাধ্য করতে বাধ্য করেছেন । তবে এর অর্থ হ'ল এগুলি আর মডিউলটিতে গোপন / গোপনীয় নয়: বাহ্যিক সংযোগ থাকার কারণে এগুলি অন্যান্য মডিউল থেকে অ্যাক্সেস করা যায়, যা আপনার আসল উদ্দেশ্য ছিল না

নামহীন namespaceএই সমস্যাটিও সমাধান করতে পারে না, কারণ এটি নির্দিষ্ট উত্স ফাইল (অনুবাদ ইউনিট) এর জন্যও সংজ্ঞায়িত এবং বাইরে থেকে অ্যাক্সেস করা যায় না।

এটা তোলে যদি এক নির্দিষ্ট পারে যে কিছু মহান হবে namespaceহয় privateযে, যাই হোক না কেন এটা সংজ্ঞায়িত করা হয়, মডিউল এটা জন্যে দ্বারা অভ্যন্তরীণভাবে ব্যবহৃত হবে বোঝানো হয়। তবে অবশ্যই সি ++ এর "মডিউল" এর মতো ধারণা নেই, কেবল "অনুবাদ ইউনিট", যা উত্স ফাইলগুলিতে দৃ tight়ভাবে আবদ্ধ।


3
এটি যাইহোক হ্যাক এবং একটি সীমাবদ্ধ সমাধান হতে পারে তবে আপনি সিপিপি ফাইল (গুলি) অভ্যন্তরীণ স্থিতিশীল বা নেমস্পিড ফাংশনগুলির সাথে আপনার 'প্রধান' সিপিপি ফাইলগুলিতে অন্তর্ভুক্ত করতে পারেন। তারপরে বিল্ড থেকে এই 'স্যাটেলাইট' সিপিপি ফাইল (গুলি) বাদ দিন এবং আপনার কাজ শেষ। আপনার যদি দুটি বা ততোধিক 'মূল' সিপিপি ফাইল থাকে এবং তারা উভয়ই 'স্যাটেলাইট' সিপিপি ফাইলগুলির মধ্যে একটি দুর্দান্ত ফাংশনটি ব্যবহার করতে চায় তবেই সমস্যা ...
সের্গেই

স্থিতিশীল কার্যাদি সমাধানের সাথে ব্যক্তিগত / সুরক্ষিত / জনসাধারণের সাথে উত্তরাধিকার ব্যবহার করছেন না?
আলী

সি ++ ২০ মডিউলগুলি উপস্থাপন করে যা আপনাকে সমস্যার সমাধান করে।
এলএফ

4

সি ++ স্ট্যান্ডার্ড 7.3.1.1 বিভাগে পড়ে আছে নামহীন নামের স্থান, অনুচ্ছেদ 2:

নাম স্থানের সুযোগে অবজেক্টগুলি ঘোষণার সময় স্থির কীওয়ার্ডের ব্যবহার অবমূল্যায়ন করা হয়, নামবিহীন-নেমস্পেস একটি উচ্চতর বিকল্প সরবরাহ করে।

স্ট্যাটিক কেবল ঘোষণা, টাইপ না করে অবজেক্ট, ফাংশন এবং বেনামী ইউনিয়নের নামগুলিতে প্রযোজ্য।


5
না, তা হয় না। একটি খসড়া করেছে। এবং এর খুব শীঘ্রই অন্য একটি খসড়া এই নির্বোধ পরিবর্তনটিকে ফিরিয়ে দিয়েছে।
আন্ডারস্কোর_ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.