কোন নামের জায়গাগুলি রয়েছে এবং নিয়মগুলি কী কী?


9

দ্রষ্টব্য: এই প্রশ্নটি সম্পর্কে name space, না namespace

সি ++ স্ট্যান্ডার্ডের কিছু উল্লেখ রয়েছে name spaceতবে আমি এর সংজ্ঞাটি দেখতে পাচ্ছি না। মানদণ্ডগুলি বলছে যে লেবেল এবং ম্যাক্রোগুলি বিভিন্ন নামের জায়গাতে রয়েছে। অন্যান্য সমস্ত উল্লেখগুলি name spaceসি / সি ++ সামঞ্জস্যতা বিভাগে রয়েছে ( বর্তমান খসড়া ) এর মতো:

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

এই নতুন নামের স্থান সংজ্ঞাটি কী? আমি এটি স্ট্যান্ডার্ডে কোথায় পাব? সঠিক নিয়ম কি? "নন-টাইপ লুকানোর ধরণের" চেয়ে নিয়মগুলি আরও জটিল বলে মনে হচ্ছে। পছন্দ করুন, এটি সংকলন করে না:

typedef int Foo; // Foo is a type
void Foo();      // not a type, but compile error, instead of hiding

তবে এটি করে:

struct Foo { }; // Foo is a type as well
void Foo();     // This hides the type Foo. "struct Foo" refers to the type

এবং এটিও সংকলন করে না:

struct Foo { };   // Type
namespace Foo { } // Non-type, but compiler error instead of hiding

ব্যবহারিক দৃষ্টিভঙ্গি হ'ল নেমস্পেস হ'ল সর্বজনীন সদস্য (উপক্লাস) সহ একক একক শ্রেণী। দয়া করে আমাকে
লিচাবেন

2
@ পিটার-রিইনস্টেটমোনিকা প্রশ্নটি আবার পড়ুন (আবার)
ওয়াইএসসি

এফডাব্লুআইডাব্লু, প্রাসঙ্গিক বিভাগগুলির সাথে আপনার লিঙ্ক লিঙ্কগুলি: আক্রান্ত সাবক্লাওজ: [শ্রেণী.নাম] [এছাড়াও [dcl.typedef] দেখুন] বিধিগুলি কীভাবে কাজ করে আপনি সেই বিভাগগুলি দেখতে পারেন।
নাথান অলিভার

লেবেলের জন্য এক: অন্তত দুটি নাম স্পেস নেই [stmt.label]/1এবং ম্যাক্রো জন্য এক [cpp]/8
ওয়াইএসসি

1
এটি কিছুটা আকর্ষণীয় (আমার কাছে) যে বর্ণনা এবং উদাহরণ উভয়ই যৌক্তিকতার দ্বারা উল্লিখিত বিপরীত চিত্রটি দেখায়; একটি টাইপ নাম একটি অ-টাইপ নাম লুকিয়ে রাখে। খসড়া স্থিতি দেওয়া, আমি অনুচ্ছেদ পরিবর্তন হবে আশা করি।
molbdnilo

উত্তর:


2

নাম স্থান মেয়াদ আইএসও সি স্ট্যান্ডার্ড আরও সুপ্রতিষ্ঠিত করা যেতে পারে; আইএসও সি 11 উদ্ধৃত :

6.2.3 শনাক্তকারীদের নাম ফাঁকা

যদি অনুবাদ ইউনিটের যে কোনও সময়ে নির্দিষ্ট পরিচয়দাতার একাধিক ঘোষণাপত্র দৃশ্যমান হয় তবে সিনট্যাক্টিক প্রসঙ্গটি বিভিন্ন সত্ত্বাকে বোঝায় এমন ব্যবহারগুলি ছত্রভঙ্গ করে। সুতরাং, শনাক্তকারীদের বিভিন্ন বিভাগের জন্য পৃথক নামের স্থান রয়েছে:

  • লেবেলের নাম (লেবেল ঘোষণা এবং ব্যবহারের সিনট্যাক্স দ্বারা বিচ্ছিন্ন);
  • কীওয়ার্ড স্ট্রাক্ট, ইউনিয়ন বা এনামের কাঠামো, ইউনিয়ন এবং গণনার ট্যাগগুলি (যে কোনও 32 অনুসরণ করে ছিন্নমূল);
  • কাঠামো বা ইউনিয়নগুলির সদস্য; প্রতিটি কাঠামো বা ইউনিয়নের সদস্যদের জন্য পৃথক নামের স্থান রয়েছে (। বা -> অপারেটরের মাধ্যমে সদস্য অ্যাক্সেস করতে ব্যবহৃত অভিব্যক্তির প্রকারের দ্বারা বিচ্ছিন্ন);
  • অন্যান্য সমস্ত শনাক্তকারী, সাধারণ শনাক্তকারী (সাধারণ ঘোষক বা গণনার স্থির হিসাবে ঘোষিত) নামে পরিচিত।

নতুন নাম স্থান সংজ্ঞা সি ++ এর অবশ্য কোন ভাবেই না হয় সময় সাম্প্রতিক , এবং তার বর্তমান আকারে বর্ণিত হয়েছে [diff.class] / 1 কি কখনো '98 সালে ISO C ++ স্ট্যান্ডার্ডের এর সূচনার পর থেকে । এটি কেবল সর্বদা প্রসঙ্গের যে কোনও দৈর্ঘ্যে উল্লেখ করা হয়েছে যার জন্য এটি আইএসও সি থেকে আলাদা, [ডিফক্লাস] / ১ অনুযায়ী যা ওপি দ্বারা উদ্ধৃত হয়েছে।

আফিক্সগুলিকে আমাদের সিএসও +11 এর space / to.২.৩ অবলম্বন করতে হবে এবং সি ++ এর (নতুন) নামের স্থান সংজ্ঞাটির একত্রীকরণ এবং সম্পূর্ণ বিবরণের জন্য আইএসও সি ++ স্ট্যান্ডার্ডের [ডিফফ্লাসক্লাস] / 1 এর সাথে একত্রিত করতে হবে , কম আমরা আইএসওকে ঘৃণা করব উদাহরণস্বরূপ [বেসিক.স্কোপ.হাইডিং] , [শ্রেণি.নাম] / 2 , [স্টেমটি.লাবেল] / 1 , [সিপিপি.রেপ্লেস] / 8 এবং এর জন্য সি ++ স্ট্যান্ডার্ড এবং কীভাবে এটি প্রয়োগ হয় তা দেখতে।

[Class.name] / 2

একটি শ্রেণীর ঘোষণাপত্র শ্রেণীর নামটিকে এমন স্কোপের সাথে পরিচয় করিয়ে দেয় যেখানে এটি ঘোষিত হয় এবং কোনও নামের ক্ষেত্রের মধ্যে কোনও শ্রেণি, পরিবর্তনশীল, ফাংশন বা সেই নামের অন্যান্য ঘোষণাকে আড়াল করে। [...]

[Stmt.label] / 1

[...] লেবেলগুলির নিজস্ব নামের স্থান রয়েছে এবং অন্যান্য সনাক্তকারীদের সাথে হস্তক্ষেপ করবেন না [...]

[Cpp.replace] / 1

[...] ম্যাক্রো নামগুলির জন্য একটি নামের জায়গা রয়েছে। [...]


1

সিতে (.2.২.৩ শনাক্তকারীদের নাম ফাঁকা) নাম ফাঁকের ধারণাটি নিম্নলিখিত উপায়ে সংজ্ঞায়িত করা হয়।

1 যদি অনুবাদ ইউনিটের যে কোনও সময়ে নির্দিষ্ট শনাক্তকারীর একাধিক ঘোষণাপত্র দৃশ্যমান হয়, তবে সিনট্যাক্টিক প্রসঙ্গটি বিভিন্ন সত্ত্বাকে বোঝায় এমন ব্যবহারগুলি বিচ্যুত করে। সুতরাং, শনাক্তকারীদের বিভিন্ন বিভাগের জন্য পৃথক নামের স্থান রয়েছে:

- লেবেলের নাম (লেবেল ঘোষণা এবং ব্যবহারের সিনট্যাক্স দ্বারা বিচ্ছিন্ন);

- কীওয়ার্ড স্ট্রাক্ট, ইউনিয়ন বা এনামের কাঠামো, ইউনিয়ন এবং গণনার ট্যাগগুলি (যে কোনও 32 অনুসরণ করে ছিন্নমূল);

- কাঠামো বা ইউনিয়নগুলির সদস্য; প্রতিটি কাঠামো বা ইউনিয়নের সদস্যদের জন্য পৃথক নামের স্থান রয়েছে (। বা -> অপারেটরের মাধ্যমে সদস্য অ্যাক্সেস করতে ব্যবহৃত অভিব্যক্তির প্রকারের দ্বারা বিচ্ছিন্ন);

- অন্যান্য সমস্ত শনাক্তকারী, সাধারণ শনাক্তকারী (সাধারণ ঘোষক বা গণনার স্থির হিসাবে ঘোষিত) বলা হয়।

সুতরাং উদাহরণস্বরূপ কোনও কাঠামোর ট্যাগের নাম কোনও ফাংশন নামের সাথে মিলিত হতে পারে কারণ তারা বিভিন্ন নামের জায়গার অন্তর্ভুক্ত। যখন আপনি কীওয়ার্ডটি ব্যবহার করতে হয় যখন আপনি কোনও কাঠামো ট্যাগের সাথে একটি কাঠামো নির্দিষ্ট করেন struct। সুতরাং উদাহরণস্বরূপ এই ঘোষণাগুলি বিরোধী নয় conflict

struct s
{
    int s;
};

void s( void );

struct s s1;

এই কোড স্নিপেটে sকাঠামোর ট্যাগের নামটি ফাংশন নামের সাথে বিরোধী নয় s কারণ ট্যাগের নামটি কীওয়ার্ডের সাথে নির্দিষ্ট করা হবে struct

সি ++ এ আপনাকে কীওয়ার্ড ছাড়াই স্ট্রাকচার ট্যাগের নাম ব্যবহার করার অনুমতি দেওয়া হচ্ছে struct

উদাহরণ স্বরূপ

struct s
{
    int s;
};

s s;

একটি সঠিক কোড। এই ঘোষণাপত্রে

s s;

ঘোষিত শনাক্তকারীর sনাম কাঠামোর নামটি গোপন করে। সুতরাং যদি আপনি উদাহরণস্বরূপ লিখবেন

s s1;

তারপরে সংকলক একটি ত্রুটি জারি করবে কারণ এই বিবৃতিতে ওপরে ঘোষিত সনাক্তকারীর নাম হিসাবে বিবেচনা করা হয়। অস্পষ্টতা সমাধানের জন্য আপনাকে কীওয়ার্ড স্ট্রাকটি ব্যবহার করতে হবে

struct s
{
    int s;
};

s s;

struct s s1;

এটি সি ++ 20 স্ট্যান্ডার্ড (6.3.1 ডিক্লারেটিভ অঞ্চল এবং স্কোপস) থেকে নিম্নলিখিত কোটটিতে বর্ণিত হয়েছে

4 একটি একক ঘোষিত অঞ্চলে ঘোষণার একটি সেট দেওয়া, যার প্রত্যেকটি একই অযোগ্য নাম নির্দিষ্ট করে,

(৪.১) - তারা সবাই একই সত্তা, বা সমস্ত ফাংশন এবং ফাংশন টেম্পলেটগুলিকে উল্লেখ করবে; অথবা

(৪.২) - ঠিক এক ঘোষণায় কোনও শ্রেণীর নাম বা গণনার নাম ঘোষণা করা হবে যা কোনও টাইপডেফ নাম নয় এবং অন্যান্য ঘোষণাগুলিতে সমস্ত একই ভেরিয়েবল, অ-স্থিতিশীল ডেটা সদস্য, বা গণককে বোঝায় বা সমস্ত ফাংশন এবং ফাংশন টেম্পলেট উল্লেখ করে ; এক্ষেত্রে শ্রেণীর নাম বা গণনার নাম গোপন (6.3.10)। [ দ্রষ্টব্য: একটি নেমস্পেসের নাম বা শ্রেণীর টেম্পলেট নামটি অবশ্যই তার ঘোষিত অঞ্চলে (10.3.2, ধারা 17) অনন্য হওয়া উচিত। - শেষ নোট ]

আপনি উদ্ধৃতিটি থেকে দেখতে পাচ্ছেন যে একটি নেমস্পেসের নামটি অবশ্যই এর ঘোষণামূলক অঞ্চলে অনন্য হতে হবে। সুতরাং এই ঘোষণা

struct Foo { };
namespace Foo { } 

ভুল

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