শিরোনাম এবং উত্স (সিপিপি) এ একটি সি ++ নেমস্পেস তৈরি করা হচ্ছে


90

কোনও নেমস্পেসে শিরোনাম এবং সিপিপি ফাইলের উভয় বিষয়বস্তু মোড়ানো বা কেবল শিরোনামের বিষয়বস্তু মোড়ানো এবং তারপরে সিপিপি ফাইলে নেমস্পেস ব্যবহার করে কোনও পার্থক্য রয়েছে ?

পার্থক্য অনুসারে আমি বলতে চাই যে কোনও প্রকারের পারফরম্যান্স পেনাল্টি বা কিছুটা আলাদা শব্দার্থ যা সমস্যার সৃষ্টি করতে পারে বা আমার যা কিছু সচেতন হওয়া দরকার।

উদাহরণ:

// header
namespace X
{
  class Foo
  {
  public:
    void TheFunc();
  };
}

// cpp
namespace X
{
  void Foo::TheFunc()
  {
    return;
  }
}

ভিএস

// header
namespace X
{
  class Foo
  {
  public:
    void TheFunc();
  };
}

// cpp
using namespace X;
{
  void Foo::TheFunc()
  {
    return;
  }
} 

যদি কোনও পার্থক্য না থাকে তবে পছন্দসই ফর্মটি কী এবং কেন?

উত্তর:


38

নেমস্পেসটি ফাংশন স্বাক্ষরের ম্যাঙ্গেলের একমাত্র উপায় যাতে তারা বিরোধ না করে। কেউ কেউ প্রথম উপায়ে পছন্দ করেন এবং অন্যরা দ্বিতীয় সংস্করণ পছন্দ করেন। উভয় সংস্করণ সংকলন সময় কর্মক্ষমতা উপর কোন প্রভাব নেই। মনে রাখবেন যে নেমস্পেসগুলি কেবল একটি সংকলন সময় সত্তা।

নেমস্পেস ব্যবহার করে যে সমস্যাটি দেখা দেয় তা কেবল তখনই হয় যখন আমাদের একই নেস্টেড নেমস্পেসের নাম থাকে (যেমন) X::X::Foo। কীওয়ার্ডটি ব্যবহার না করে বা না করেই এটি আরও বিভ্রান্তি সৃষ্টি করে।


56

"নেমস্পেস এক্স" থেকে "নেমস্পেস এক্স ব্যবহার করে" এর পার্থক্য প্রথমটিতে কোনও নতুন ঘোষণা নাম জায়গার অধীনে থাকবে এবং দ্বিতীয়টিতে তা হবে না।

আপনার উদাহরণে কোনও নতুন ঘোষণা নেই - সুতরাং কোনও পার্থক্য নেই তাই পছন্দসই উপায় নয়।


এটি প্রকল্প এবং স্টাইলের উপর নির্ভর করে। মডিউলটিতে প্রায়শই ফাইলের বোঝার জন্য একটি প্রধান নেমস্পেস থাকে এবং দ্বিতীয় স্টাইলটি বোঝায়।
নিকোলাস উইলসন

8

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

;-) এর {পরে আপনার বিপথগামীusing namespace


একে একে বিপথগামী বলব না, কারণ এটি একেবারে শেষের }সাথে মিলে যায় । তবে, আমি এই জোড় ধনুর্বন্ধকে অপ্রয়োজনীয় কল করব;)
ব্লুবার্ডিব্লুব

@blubberdiblub, প্রশ্ন সম্পাদিত হয়েছে, আপনি যদি মূল সংস্করণ চেক করা থাকে, আপনি হবে কল এটা বিপথগামী ;-)
হ্যাকার - মাইকেল Krelin

1

দ্বিতীয়টিও যদি সংকলন করে তবে কোনও পার্থক্য থাকতে হবে না। নেমস্পেসগুলি সংকলন-সময়ে প্রক্রিয়া করা হয় এবং রানটাইম ক্রিয়াকলাপগুলিকে প্রভাবিত করে না।

তবে ডিজাইন ইস্যুগুলির জন্য, দ্বিতীয়টি ভয়াবহ। এটি সঙ্কলন করলেও (নিশ্চিত নয়), এটি মোটেই বোঝা যায় না।


4
আমি মনে করি না এটি সংকলন করেছে, তবে একটি পার্থক্যের কারণে নয়, তবে একটি বিপথগামী {;-)
মাইকেল ক্রেলিন - হ্যাকার

পার্থক্যটি হ'ল ফু :: দ্য ফানক () বিশ্বব্যাপী নেমস্পেসে ঘোষিত হয়েছে, যখন এটি নাম স্পেস এক্স
-এ

1

দ্য ফু :: দ্য ফাঙ্ক () ভিএস-ক্ষেত্রে সঠিক নেমস্পেসিনে নেই। সঠিক নামস্থান (এক্স) এ কার্যকারিতাটি প্রয়োগ করতে 'অকার্যকর এক্স :: ফু: দ্য ফাঙ্ক () {}' ব্যবহার করুন।


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

1

যদি আপনি কেবলমাত্র .h বিষয়বস্তু মোড়না করেন তবে আপনাকে সিপিপিতে ফাইলের নেমস্পেস ব্যবহার করে লিখতে হবে ... অন্যথায় আপনি প্রতিবার বৈধ নেমস্পেসে কাজ করছেন। সাধারণত আপনি .cpp এবং .h ফাইল উভয়ই মুড়ে রাখেন অন্যথায় আপনি অন্য নেমস্পেস থেকে এমন বস্তু ব্যবহার করার ঝুঁকিতে থাকেন যা প্রচুর সমস্যা তৈরি করতে পারে।



0

যদি আপনি একের থেকে অন্যটিতে ভেরিয়েবলগুলি ব্যবহার করার চেষ্টা করছেন তবে আমি সেগুলি বহিরাগত করার পরামর্শ দেব, তারপরে উত্স ফাইলে তাদের আরম্ভ করার মতো:

// [.hh]
namespace example
{
   extern int a, b, c;
}
// [.cc]
// Include your header, then init the vars:
namespace example
{
   int a, b, c;
}
// Then in the function below, you can init them as what you want: 
void reference
{
    example::a = 0;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.