অজ্ঞাত / বেনাম নেমস্পেস বনাম স্থির ফাংশন


507

সি ++ এর একটি বৈশিষ্ট্য হ'ল নামবিহীন (বেনামে) নাম স্থান তৈরি করার ক্ষমতা:

namespace {
    int cannotAccessOutsideThisFile() { ... }
} // namespace

আপনি ভাববেন যে এই জাতীয় বৈশিষ্ট্যটি অকেজো হবে - যেহেতু আপনি নামের জায়গার নামটি নির্দিষ্ট করতে পারবেন না, বাইরে থেকে এর ভিতরে কোনও কিছুর অ্যাক্সেস করা অসম্ভব। কিন্তু এই নামহীন নামব্যবধান হয় , তারা তৈরি করছি ফাইল মধ্যে ব্যবহারযোগ্য হিসেবে যদি আপনি তাদের একটি অন্তর্নিহিত ব্যবহার-দফা ছিল।

আমার প্রশ্নটি হল, স্থির ফাংশনগুলি ব্যবহার করার জন্য কেন বা কখন এইটি পছন্দনীয় হবে? বা তারা মূলত একই জিনিসটি করার দুটি উপায়?


13
সি ++ 11 staticএ এই প্রসঙ্গে ব্যবহারের অবমূল্যায়ন করা হয়েছিল ; যদিও নামবিহীন নেমস্পেসের জন্য এটি সর্বোত্তম বিকল্পstatic , এমন কিছু ঘটনা রয়েছে যেখানে staticউদ্ধারকালে এটি ব্যর্থ হয়
কিংবদন্তি

উত্তর:


332

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

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

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

সম্পাদনা:

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

নামবিহীন নেমস্পেসগুলি এখনও আপনাকে অনুবাদ-ইউনিট-স্থানীয় ধরণের সংজ্ঞা দেওয়ার সুযোগ দেয়। দয়া করে দেখুনআরও তথ্যের জন্য এই তাই প্রশ্ন দেখুন।

এটি আমার নজরে আনার জন্য ক্রেডিট মাইক পার্সিকে যায় ।


39
প্রধান গীক কেবল ফাংশনের বিপরীতে স্থিত কীওয়ার্ড সম্পর্কে জিজ্ঞাসা করে। নাম স্পেসে ঘোষিত সত্তায় প্রয়োগ করা স্ট্যাটিক কীওয়ার্ডটি এর অভ্যন্তরীণ লিঙ্কেজ নির্দিষ্ট করে। বেনামে নামস্থলে ঘোষিত সত্তার বহিরাগত সংযোগ রয়েছে (সি ++ / 3.5) তবে এটি অনন্যরূপে স্কোপে বেঁচে থাকার নিশ্চয়তা রয়েছে। নামবিহীন নেমস্পেসের এই বেনামিটি কেবল একটি অনুবাদ ইউনিটের মধ্যে থেকে এটিকে অ্যাক্সেসযোগ্য করে তুলতে কার্যকরভাবে এর ঘোষণাটি আড়াল করে। পরেরটি কার্যকরভাবে স্ট্যাটিক কীওয়ার্ডের মতো একই পদ্ধতিতে কাজ করে।
এম্লোসকোট

5
বাহ্যিক সংযোগের অপূর্ণতা কী? এটি ইনলাইনিংকে প্রভাবিত করতে পারে?
অ্যালেক্স

17
সি ++ ডিজাইনের কমিটিকে যারা স্ট্যাটিক কীওয়ার্ড অবহেলিত বলেছিলেন তারা সম্ভবত কোনও বৃহত রিয়েল ওয়ার্ল্ড সিস্টেমে কোনও বৃহত সি কোড নিয়ে কাজ করেননি ... (আপনি তাত্ক্ষণিকভাবে একটি স্ট্যাটিক কীওয়ার্ড দেখতে পাচ্ছেন তবে বেনামে নেমস্পেস না থাকলে এতে যদি বড় মন্তব্য সহ প্রচুর ঘোষণাপত্র থাকে ব্লক।)
ক্যালমারিয়াস

23
যেহেতু এই উত্তরটি "সি ++ বেনামে নামস্থান" এর জন্য শীর্ষ ফলাফল হিসাবে গুগলে উঠে আসে, তবে এটি লক্ষ করা উচিত যে স্ট্যাটিকের ব্যবহার আর হ্রাস করা হয় না। দেখুন stackoverflow.com/questions/4726570/... এবং open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1012 আরও তথ্যের জন্য।
মাইকেল পার্সি

2
পছন্দ করুন আপনার কি পুনরুত্পাদনযোগ্য উদাহরণ রয়েছে? সি ++ 11 হিসাবে - এবং এর আগেও কিছু সংকলকগুলিতে - নামহীন namespaceএর অন্তর্নিহিত স্পষ্টভাবে অন্তর্ভুক্ত থাকে, সুতরাং কোনও পার্থক্য থাকা উচিত should পূর্বে দুর্বল কথা বলা থেকে উদ্ভূত যে কোনও সমস্যা এটিকে C ++ 11 এ প্রয়োজনীয়তা তৈরি করে সমাধান করা হয়েছিল।
আন্ডারস্কোর_ডি

73

বেনামে নামকরণের জায়গায় পদ্ধতি রাখার ফলে আপনি দুর্ঘটনাক্রমে একটি সংজ্ঞা বিধি লঙ্ঘন করা থেকে বিরত থাকেন নামকরণের জায়গাগুলিতে রাখার ফলে আপনি আপনাকে যে কোনও অন্যান্য পদ্ধতির সাথে সংযুক্ত করতে পারেন এমনভাবে আপনার সহায়ক পদ্ধতির নামকরণের বিষয়ে কখনও চিন্তা করতে পারবেন না to

এবং, যেমন লুক দ্বারা নির্দেশিত, অজ্ঞাতনামা নামের স্থান স্থিতিশীল সদস্যদের চেয়ে মান দ্বারা পছন্দ করা হয়।


2
আমি স্ট্যাটিক স্ট্যান্ড-অলোন ফাংশনগুলি (যেমন ফাইল-স্কোপড ফাংশন) উল্লেখ করছি, স্থির সদস্য ফাংশনগুলি নয়। স্থির একা একা ফাংশন একটি নামবিহীন নেমস্পেসে ফাংশন হিসাবে অনেক একই, এইভাবে প্রশ্ন।
হেড গিক

2
আহ; ঠিক আছে, ওডিআর এখনও প্রযোজ্য। অনুচ্ছেদ সরানোর জন্য সম্পাদিত।
hazzen

আমি যেমন পেয়েছি, স্ট্যাটিক ফাংশনের জন্য ওডিআর কাজ করে না যখন এটি শিরোনামে সংজ্ঞায়িত হয় এবং এই শিরোনামটি একাধিক অনুবাদ ইউনিটে অন্তর্ভুক্ত করা হয়, তাই না? এক্ষেত্রে আপনি একই ফাংশনের একাধিক অনুলিপিগুলি পান
অ্যান্ড্রি টাইলিচকো

@ অ্যান্ডি টি: অন্তর্ভুক্ত শিরোলেখের ক্ষেত্রে আপনি "একাধিক সংজ্ঞা" সত্যই দেখতে পাচ্ছেন না। প্রিপ্রসেসর এটি যত্ন নেয়। প্রিপ্রসেসর উত্পাদিত আউটপুট অধ্যয়ন করার প্রয়োজন না থাকলে এটি আমার কাছে বরং বহিরাগত এবং বিরল লাগে। এছাড়াও হেডার ফাইলগুলিতে "রক্ষী" অন্তর্ভুক্ত করার একটি ভাল অনুশীলন রয়েছে, যেমন: "#ifndef SOME_GUARD - # Define SOME_GUARD ..." যা প্রিপ্রোসেসরকে একই হেডার অন্তর্ভুক্ত করে দু'বার আটকাতে পারে বলে মনে করা হচ্ছে।
নিকিতা ভার্টনসভ

@ নিকিতা ভারটনসভ গার্ড একই শিরোনামটিকে একই অনুবাদ ইউনিটে অন্তর্ভুক্ত করতে বাধা দিতে পারে, তবে এটি বিভিন্ন অনুবাদ ইউনিটে একাধিক সংজ্ঞা দেয়। এর ফলে "একাধিক সংজ্ঞা" লিঙ্কারের ত্রুটির কারণ হতে পারে।
অ্যালেক্স

37

একটি প্রান্তের কেস রয়েছে যেখানে স্থির একটি আশ্চর্যজনক প্রভাব ফেলে (কমপক্ষে এটি আমার কাছে ছিল)। সি ++ 03 স্ট্যান্ডার্ড 14.6.4.2/1 এ দেখায়:

কোনও ফাংশন কলের জন্য যা কোনও টেম্পলেট প্যারামিটারের উপর নির্ভর করে, যদি ফাংশনটির নামটি একটি অযোগ্য-আইডি হয় তবে কোনও টেম্পলেট-আইডি না হয় , তবে প্রার্থী ফাংশনগুলি সন্ধানের নিয়মিত নিয়ম (3.4.1, 3.4.2) ব্যবহার করে খুঁজে পাওয়া যায়:

  • অযোগ্য নাম অনুসন্ধান (3.4.1) ব্যবহার করে দেখার অংশটির জন্য, কেবলমাত্র টেমপ্লেট সংজ্ঞা প্রসঙ্গ থেকে বাহ্যিক সংযোগ সহ ফাংশন ঘোষণাগুলি পাওয়া যায়।
  • সম্পর্কিত নেমস্পেসগুলি (3.4.2) ব্যবহার করে অনুসন্ধানের অংশের জন্য, কেবলমাত্র টেম্পলেট সংজ্ঞা প্রসঙ্গে বা টেম্পলেট ইনস্ট্যান্টেশন প্রসঙ্গে পাওয়া যায় কেবলমাত্র বাহ্যিক সংযোগের সাথে ফাংশন ঘোষণাগুলি পাওয়া যায়।

...

নীচের কোডটি কল করবে foo(void*)এবং foo(S const &)আপনার প্রত্যাশা মতো নয়।

template <typename T>
int b1 (T const & t)
{
  foo(t);
}

namespace NS
{
  namespace
  {
    struct S
    {
    public:
      operator void * () const;
    };

    void foo (void*);
    static void foo (S const &);   // Not considered 14.6.4.2(b1)
  }

}

void b2()
{
  NS::S s;
  b1 (s);
}

নিজের মধ্যে এটি সম্ভবত এটি খুব বড় চুক্তি নয়, তবে এটি হাইলাইট করে যে পুরোপুরি কমপ্লায়েন্ট সি ++ কম্পাইলারের জন্য (অর্থাত্ সমর্থনের জন্য একটি export) staticকীওয়ার্ডটিতে এখনও কার্যকারিতা থাকবে যা অন্য কোনও উপায়ে উপলভ্য নয়।

// bar.h
export template <typename T>
int b1 (T const & t);

// bar.cc
#include "bar.h"
template <typename T>
int b1 (T const & t)
{
  foo(t);
}

// foo.cc
#include "bar.h"
namespace NS
{
  namespace
  {
    struct S
    {
    };

    void foo (S const & s);  // Will be found by different TU 'bar.cc'
  }
}

void b2()
{
  NS::S s;
  b1 (s);
}

আমাদের নামবিহীন নেমস্পেসের ফাংশনটি ADL ব্যবহার করে টেমপ্লেটগুলিতে পাওয়া যাবে না তা নিশ্চিত করার একমাত্র উপায় static

আধুনিক সি ++ এর জন্য আপডেট

সি ++ '11 অনুসারে, নামবিহীন নেমস্পেসের সদস্যদের অন্তর্নিহিত সংযোগ স্পষ্টভাবে (3.5 / 4) রয়েছে:

নামবিহীন নেমস্পেসের মধ্যে প্রত্যক্ষ বা অপ্রত্যক্ষভাবে ঘোষিত একটি নামবিহীন নেমস্পেস বা একটি নেমস্পেসের অভ্যন্তরীণ সংযোগ রয়েছে।

তবে একই সময়ে, লিঙ্কেজের উল্লেখ মুছে ফেলার জন্য 14.6.4.2/1 আপডেট করা হয়েছিল (এটি সি ++ 'থেকে নেওয়া):

কোনও ফাংশন কলের জন্য যেখানে পোস্টফিক্স-এক্সপ্রেশন একটি নির্ভরশীল নাম, প্রার্থী ফাংশনগুলি সন্ধান করার জন্য নিয়মিত লুকের নিয়মগুলি (3.4.1, 3.4.2) ব্যবহার করে পাওয়া যায়:

  • অযোগ্য নাম অনুসন্ধান (3.4.1) ব্যবহার করে দেখার অংশটির জন্য, কেবলমাত্র টেমপ্লেট সংজ্ঞা প্রসঙ্গ থেকে ফাংশন ঘোষণাগুলি পাওয়া যায়।

  • সম্পর্কিত নেমস্পেসগুলি (3.4.2) ব্যবহার করে অনুসন্ধানের অংশের জন্য, কেবলমাত্র টেম্পলেট সংজ্ঞা প্রসঙ্গে বা টেমপ্লেট ইনস্ট্যান্টেশন প্রসঙ্গে পাওয়া ফাংশন ঘোষণাগুলি পাওয়া যায়।

ফলাফলটি হ'ল স্থির এবং নামবিহীন নেমস্পেস সদস্যদের মধ্যে এই বিশেষ পার্থক্যটি আর বিদ্যমান নেই।


3
রফতান কীওয়ার্ডটি কি কোল্ড ডেড হওয়ার কথা নয়? কেবল "রপ্তানি" সমর্থনকারী কম্পাইলার পরীক্ষামূলক বেশী, এবং যদি না চমকের, "রপ্তানি" এমনকি কারণ অপ্রত্যাশিত পার্শ্ব অন্যদের মধ্যে (না করছেন তার জন্য আশা ছিল ছাড়াও) বাস্তবায়িত হবে না
paercebal

2
সাবজেটটিতে হার্ব সটারের নিবন্ধটি দেখুন: getw.ca/publications/mill23-x.htm
প্যারাসেবল

3
এডিসন ডিজাইন গ্রুপ (ইডিজি) এর সম্মুখ-প্রান্তটি পরীক্ষামূলক কিছু নয়। এটি প্রায় নিশ্চিতভাবেই বিশ্বের সর্বাধিক মানক সি ++ বাস্তবায়ন। ইন্টেল সি ++ সংকলকটি ইডিজি ব্যবহার করে।
রিচার্ড কর্ডেন

1
কোন সি ++ বৈশিষ্ট্যের 'অপ্রত্যাশিত পার্শ্ব-প্রতিক্রিয়া' নেই? রফতানির ক্ষেত্রে, এটি এমন একটি নামবিহীন নেমস্পেস ফাংশনটি ভিন্ন টিউ থেকে পাওয়া যাবে - এটি আপনি একইভাবে টেম্পলেট সংজ্ঞাটি অন্তর্ভুক্ত করেছেন বলে একই। এরকম না হলে আরও অবাক হওয়ার কথা!
রিচার্ড কর্ডেন

আমার মনে হয় সেখানে আপনার টাইপো আছে - NS::Sকাজের জন্য, Sভিতরে থাকা দরকার নেই namespace {}?
এরিক

12

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

উদাহরণস্বরূপ, আমার XMLUtil.cpp ফাইলে, আমি XmlUtil_I { ... }আমার সমস্ত মডিউল ভেরিয়েবল এবং ফাংশনের জন্য একটি নেমস্পেসের সংজ্ঞা দিই । এইভাবে আমি XmlUtil_I::ভেরিয়েবলগুলি অ্যাক্সেস করতে ডিবাগারে যোগ্যতা প্রয়োগ করতে পারি । এই ক্ষেত্রে, এটি _Iসর্বজনীন নেমস্পেসের থেকে আলাদা করে যেমন XmlUtilআমি অন্য কোথাও ব্যবহার করতে চাই।

আমি মনে করি সত্যিকারের বেনামের তুলনায় এই পদ্ধতির সম্ভাব্য অসুবিধা হ'ল যে কেউ অন্য মডিউলে নেমস্পেসের যোগ্যতা ব্যবহার করে কাঙ্ক্ষিত স্থিতিশীল সুযোগটি লঙ্ঘন করতে পারে। যদিও এটি বড় উদ্বেগ কিনা তা আমি জানি না।


7
আমি এটিও করেছি, তবে সাথে #if DEBUG namespace BlahBlah_private { #else namespace { #endif, সুতরাং "মডিউল নেমস্পেস" কেবলমাত্র ডিবাগ বিল্ডগুলিতে উপস্থিত থাকে এবং অন্যথায় সত্যিকারের বেনামে নেমস্পেস ব্যবহৃত হয়। এটি সুন্দর হবে যদি ডিবাগাররা এটি পরিচালনা করার জন্য একটি দুর্দান্ত উপায় দেয়। অক্সিজেন এটি দ্বারা বিভ্রান্ত হয়।
ক্রিস্টোফার জনসন

4
নামবিহীন নেমস্পেস সত্যই স্থিতির জন্য কোনও কার্যকর প্রতিস্থাপন নয়। অচল অর্থ "সত্যই এটি টিউ এর সাথে কখনও যুক্ত হয় না"। নামবিহীন নেমস্পেসের অর্থ "এটি এখনও র্যান্ডম নাম হিসাবে রফতানি করা হয়, যদি
টিউর

7

সেই লক্ষ্যে স্থিতিশীল কীওয়ার্ডের ব্যবহার C ++ 98 স্ট্যান্ডার্ড দ্বারা অবচয় করা হয়েছে। স্থির সমস্যাটি হ'ল এটি সংজ্ঞা টাইপ করতে প্রযোজ্য না। এটি একটি ওভারলোডেড কীওয়ার্ড যা বিভিন্ন প্রসঙ্গে বিভিন্ন উপায়ে ব্যবহৃত হয়, তাই নামবিহীন নেমস্পেসগুলি কিছুটা সহজ করে তোলে।


1
আপনি যদি কেবল কোনও একক অনুবাদ ইউনিটে কোনও প্রকার ব্যবহার করতে চান তবে এটি .cpp ফাইলের মধ্যে ঘোষণা করুন। এটি অন্য অনুবাদ ইউনিট থেকে যাইহোক অ্যাক্সেসযোগ্য হবে না।
কলমারিয়াস

4
আপনি ভাববেন, তাই না? কিন্তু যদি একই অ্যাপ্লিকেশনটিতে অন্য কোনও অনুবাদ ইউনিট (= সিপিপি-ফাইল) কখনও একই নামের সাথে কোনও প্রকারের ঘোষণা করে, আপনি বরং হার্ড-টু-ডিবাগ সমস্যার জন্য রয়েছেন :-)। উদাহরণস্বরূপ, আপনি এমন পরিস্থিতিতে শেষ করতে পারেন যেখানে অন্যের জন্য কল করার পদ্ধতিগুলিতে কোনও একের জন্য ভিটিবেল ব্যবহৃত হয়।
avl_swen

1
আর হতাশ নয়। এবং প্রকারভেদগুলি রফতানি হয় না, সুতরাং এটি অর্থহীন। স্ট্যাডিকস স্ট্যান্ডেলোন ফাংশন এবং গ্লোবাল ভার্সের জন্য দরকারী। নামবিহীন নেমস্পেসগুলি ক্লাসের জন্য দরকারী।
এরিক অ্যারোনস্টি

6

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

তবে সোলারিসে চলমান একটি পুরানো সংকলক, যা আমরা অনির্ধারিত ভবিষ্যতের প্রকাশ না হওয়া অবধি বিবাহ করি, কখনও কখনও এটি গ্রহণ করিবে এবং অন্য সময় এটি ত্রুটি হিসাবে চিহ্নিত করে। ত্রুটিটি আমাকে চিন্তিত করে না, এটি গ্রহণ করার পরে এটি হতে পারে । সুতরাং আমরা বোর্ড জুড়ে আধুনিক না হওয়া পর্যন্ত আমরা এখনও স্ট্যাটিক (সাধারণত শ্রেণিবদ্ধ) ফাংশন ব্যবহার করি যেখানে আমরা বেনামে নামটি পছন্দ করি।


3

এছাড়াও যদি কোনও উদাহরণের মতো কোনও চলকটিতে স্থির কীওয়ার্ড ব্যবহার করা হয়:

namespace {
   static int flag;
}

এটি ম্যাপিং ফাইলটিতে দেখা যাবে না


7
তাহলে আপনার কোনও বেনামে নেমস্পেসের দরকার নেই।
কলমারিয়াস

2

বেনামে নামস্থান এবং স্থির ফাংশনগুলির মধ্যে একটি সংকলক নির্দিষ্ট পার্থক্য নিম্নলিখিত কোডটি সংকলন করতে দেখা যায়।

#include <iostream>

namespace
{
    void unreferenced()
    {
        std::cout << "Unreferenced";
    }

    void referenced()
    {
        std::cout << "Referenced";
    }
}

static void static_unreferenced()
{
    std::cout << "Unreferenced";
}

static void static_referenced()
{
    std::cout << "Referenced";
}

int main()
{
    referenced();
    static_referenced();
    return 0;
}

এই কোডটি ভিএস 2017 দিয়ে সংকলন করুন (সতর্কতা C4505 সক্ষম করার জন্য স্তর 4 সতর্কতা পতাকা / ডাব্লু 4 উল্লেখ করুন : অবাস্তবহীন স্থানীয় ফাংশন সরিয়ে ফেলা হয়েছে ) এবং জিসিসি 4.9 -উন্সযুক্ত-ফাংশন বা -ওয়াল পতাকা সহ দেখায় যে ভিএস 2017 কেবলমাত্র একটি সতর্কতা তৈরি করবে অব্যবহৃত স্থির ফাংশন। জিসিসি ৪.৯ এবং উচ্চতর, পাশাপাশি ঝাঁকুনি ৩.৩ এবং উচ্চতর, নেমস্পেসে অননুমোদিত ফাংশনের জন্য সতর্কতা এবং অব্যবহৃত স্থির ফাংশনের জন্য একটি সতর্কতাও তৈরি করবে।

জিসিসি 4.9 এবং এমএসভিসি 2017 এর লাইভ ডেমো


2

নিম্নলিখিত কারণে নামহীন নেমস্পেসের তুলনায় ব্যক্তিগতভাবে আমি স্থির ফাংশনগুলি পছন্দ করি:

  • এটি একমাত্র ফাংশন সংজ্ঞা থেকে স্পষ্ট এবং স্পষ্ট যে এটি অনুবাদ ইউনিটে যেখানে এটি সংকলিত হয়েছে এটি ব্যক্তিগত। নামহীন নেমস্পেসের সাথে আপনাকে কোনও স্ক্রিন নামস্থানে রয়েছে কিনা তা দেখতে আপনাকে স্ক্রোল করে অনুসন্ধান করতে হবে।

  • নেমস্পেসে ফাংশনগুলি কিছু (পুরানো) সংকলক দ্বারা বাহ্য হিসাবে বিবেচিত হতে পারে। ভিএস2017 এ তারা এখনও বাহ্যিক। এই কারণে কোনও ফাংশন নামহীন নেমস্পেসে থাকলেও আপনি এখনও এটিকে স্থির হিসাবে চিহ্নিত করতে চাইতে পারেন।

  • স্ট্যাটিক ফাংশনগুলি সি বা সি ++-তে খুব অনুরূপ আচরণ করে, যখন নামহীন নামস্থানগুলি কেবলমাত্র C ++। নামহীন নেমস্পেসগুলি ইনডেন্টেশনে অতিরিক্ত স্তর যুক্ত করে এবং আমি এটি পছন্দ করি না :)

সুতরাং, আমি দেখতে পেরে খুশি যে ফাংশনগুলির জন্য স্ট্যাটিকের ব্যবহারটি আর অবচয়হীন নয়


বেনামে নামস্থানগুলিতে ফাংশনগুলির বাহ্যিক সংযোগ থাকার কথা। এগুলি কেবল অনন্য করে তোলার জন্য তারা ম্যাঙ্গেলড're শুধুমাত্র staticকীওয়ার্ডটি কোনও ফাংশনে স্থানীয় লিঙ্কেজ প্রয়োগ করে। এছাড়াও, অবশ্যই কেবল একটি পাগল পাগল প্রকৃতপক্ষে নেমস্পেসের জন্য ইন্ডেন্টেশন যুক্ত করবে?
Roflcopter4

0

আপনার প্রশ্নটি পড়ার সময় কেবল এই বৈশিষ্ট্যটি শিখলে, আমি কেবল অনুমান করতে পারি। এটি ফাইল-স্তরের স্থিতিশীল ভেরিয়েবলের থেকে বেশ কয়েকটি সুবিধা সরবরাহ করে বলে মনে হচ্ছে:

  • নামবিহীন নেমস্পেসগুলি একে অপরের মধ্যে বাসা বাঁধতে পারে, একাধিক স্তর সুরক্ষা সরবরাহ করে যা থেকে প্রতীকগুলি এড়াতে পারে না।
  • একই উত্স ফাইলে বেশ কয়েকটি বেনামে নেমস্পেস স্থাপন করা যেতে পারে, একই ফাইলে বিভিন্ন স্ট্যাটিক-স্তরের স্কোপগুলি কার্যকরভাবে তৈরি করে।

কেউ যদি সত্যিকারের কোডে বেনামে নেমস্পেস ব্যবহার করে থাকে তবে আমি আগ্রহী in


4
ভাল জল্পনা, তবে ভুল। এই নেমস্পেসগুলির ব্যাপ্তি ফাইল-বিস্তৃত।
কনরাড রুডলফ

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

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

0

পার্থক্যটি ম্যাঙ্গেলড আইডেন্টিফায়ারটির নাম ( _ZN12_GLOBAL__N_11bEবনাম _ZL1b, যা আসলেই কিছু যায় আসে না, তবে তারা উভয়ই প্রতীক টেবিলের স্থানীয় প্রতীকগুলিতে একত্রিত হয় ( .globalasm ডিরেক্টরের অনুপস্থিত ))।

#include<iostream>
namespace {
   int a = 3;
}

static int b = 4;
int c = 5;

int main (){
    std::cout << a << b << c;
}

        .data
        .align 4
        .type   _ZN12_GLOBAL__N_11aE, @object
        .size   _ZN12_GLOBAL__N_11aE, 4
_ZN12_GLOBAL__N_11aE:
        .long   3
        .align 4
        .type   _ZL1b, @object
        .size   _ZL1b, 4
_ZL1b:
        .long   4
        .globl  c
        .align 4
        .type   c, @object
        .size   c, 4
c:
        .long   5
        .text

নেস্টেড বেনামে নামস্থান হিসাবে:

namespace {
   namespace {
       int a = 3;
    }
}

        .data
        .align 4
        .type   _ZN12_GLOBAL__N_112_GLOBAL__N_11aE, @object
        .size   _ZN12_GLOBAL__N_112_GLOBAL__N_11aE, 4
_ZN12_GLOBAL__N_112_GLOBAL__N_11aE:
        .long   3
        .align 4
        .type   _ZL1b, @object
        .size   _ZL1b, 4

অনুবাদ ইউনিটে সমস্ত প্রথম স্তরের বেনাম নেমস্পেসগুলি একে অপরের সাথে একত্রিত হয়, অনুবাদ ইউনিটে সমস্ত ২ য় স্তরের নেস্টেড বেনাম নেমস্পেসগুলি একে অপরের সাথে একত্রিত হয়

আপনার কোনও বেনামে নেমস্পেসে নেস্টেড (ইনলাইন) নেমস্পেস থাকতে পারে

namespace {
   namespace A {
       int a = 3;
    }
}

        .data
        .align 4
        .type   _ZN12_GLOBAL__N_11A1aE, @object
        .size   _ZN12_GLOBAL__N_11A1aE, 4
_ZN12_GLOBAL__N_11A1aE:
        .long   3
        .align 4
        .type   _ZL1b, @object
        .size   _ZL1b, 4

which for the record demangles as:
        .data
        .align 4
        .type   (anonymous namespace)::A::a, @object
        .size   (anonymous namespace)::A::a, 4
(anonymous namespace)::A::a:
        .long   3
        .align 4
        .type   b, @object
        .size   b, 4

আপনি বেনামে ইনলাইন নেমস্পেসও রাখতে পারেন, তবে যতদূর আমি বলতে পারি, inlineএকটি বেনামে নেমস্পেসে 0 টি প্রভাব রয়েছে

inline namespace {
   inline namespace {
       int a = 3;
    }
}

_ZL1b: _Zমানে এটি একটি ম্যাংলেড শনাক্তকারী। Lএর অর্থ এটি একটি স্থানীয় প্রতীক static1শনাক্তকারীর দৈর্ঘ্য bএবং তারপরে শনাক্তকারীb

_ZN12_GLOBAL__N_11aE _Zএর অর্থ এটি একটি ম্যাঙ্গলেড সনাক্তকারী। Nএই একটি নামস্থান মানে 12বেনামী নামস্থান নামের দৈর্ঘ্য হল _GLOBAL__N_1, তারপর বেনামী নামস্থান নাম _GLOBAL__N_1, তারপর 1শনাক্তকারীর দৈর্ঘ্য হল a, aআইডেন্টিফায়ার aএবং Eশনাক্তকারী বন্ধ করে একটি নামস্থানে থাকা।

_ZN12_GLOBAL__N_11A1aE এটির মধ্যে আরও একটি নেমস্পেসের স্তর বাদে উপরের মতোই 1A

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