সি ++ তে, একটি "নেমস্পেস ওরফে" কী?


উত্তর:


186

একটি নেমস্পেসের নামটি একটি দীর্ঘ, ছোট নাম দ্বারা আলাদা, সংক্ষিপ্ত নামের সাথে উল্লেখ করার একটি সুবিধাজনক উপায়।

উদাহরণস্বরূপ, বলুন যে আপনি কোনও using namespaceনির্দেশ ছাড়াই বুস্টের ইউব্ল্যাএলএস থেকে সংখ্যক ভেক্টর ব্যবহার করতে চেয়েছিলেন । প্রতিবার পুরো নেমস্পেসটি উল্লেখ করা জটিল:

boost::numeric::ublas::vector<double> v;

পরিবর্তে, আপনি এর জন্য একটি নাম নির্ধারণ করতে পারেন boost::numeric::ublas- বলুন আমরা এটি সংক্ষিপ্ত করতে চাই ublas:

namespace ublas = boost::numeric::ublas;


ublas::vector<double> v;

7
ডাউনভোটগুলি সম্ভবত ব্যাখ্যা করতে, এসও হয় না এবং কখনও কখনও একটি ভাল সি ++ পাঠ্যপুস্তক প্রতিস্থাপন হবে না। আপনার দ্বারা উত্থাপিত প্রশ্নের উত্তর এই জাতীয় কোনও বইয়ের দ্বারা দেওয়া হবে। এবং আপনার নিজের প্রশ্নের উত্তর দেওয়ার এসও "বৈশিষ্ট্য" এই জাতীয় বইয়ের অনুচ্ছেদে সরবরাহ করার জন্য ব্যবহার করা উচিত নয়।

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

1
জ্বালা এড়াতে অবশ্যই আপনার নিজের প্রশ্নের উত্তর দেওয়ার একটা শিষ্টাচার রয়েছে; এই ক্ষেত্রে এটি বেশ প্রকট যে এটি কখনই আসল প্রশ্ন ছিল না । উদাহরণস্বরূপ, স্ট্যাকওভারফ্লো.
com/ প্রশ্নগুলি /

6
@ মার্টিন বি: আমি একমত নই যে এটি একটি এন্ট্রি লেভেল প্রশ্ন - আসলে অতীতে অনেক ভোট দিয়ে এখন অনেক বেশি প্রশ্ন করা হয়েছিল। এই বলে, লোকেরা মনে করতে পারে আপনি কেবল নিজের জন্য খ্যাতি অর্জনের চেষ্টা করছেন। এটিকে ঘিরে একটি উপায় হ'ল প্রশ্ন / উত্তর উভয়কে "সম্প্রদায় উইকি" হিসাবে চিহ্নিত করা। ব্যক্তিগতভাবে আমি আপনার মতো প্রশ্ন এবং সম্প্রদায় হিসাবে উত্তর দিয়ে যেতে চাই। যদি প্রশ্নটির যোগ্যতা থাকে তবে আপনি ROI পাবেন।
রিচার্ড কর্ডেন

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

7

একদম সহজ, # সংজ্ঞাটি কাজ করবে না।

namespace Mine { class MyClass { public: int i; }; }
namespace His = Mine;
namespace Yours { class Mine: public His::MyClass { void f() { i = 1; } }; }

জরিমানা সংকলন। আপনাকে নেমস্পেস / শ্রেণির নামের সংঘাতের চারপাশে কাজ করতে দেয়।

namespace Nope { class Oops { public: int j; }; }
#define Hmm Nope
namespace Drat { class Nope: public Hmm::Oops { void f () { j = 1; } }; }

শেষ লাইনে, "হুঁ: ওফস" একটি সংকলন ত্রুটি। প্রাক-প্রসেসর এটিকে নপ :: ওপস এ পরিবর্তন করে, তবে নোপ ইতিমধ্যে একটি শ্রেণীর নাম।


3
কি # ডেফাইন? সম্ভবত আপনার উত্তর প্রশ্নের পূর্ববর্তী সংস্করণ বোঝায়?
einpoklum

3

এই বিষয়ে আরো http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-1-of-n

লুং নেমস্পেসের নামের জন্য এটি একটি নাম নির্বাচন করা যেমন:

namespace SHORT = NamespaceFirst::NameSpaceNested::Meow

তারপরে, আপনি টাইপডেফ করতে পারেন

typedef SHORT::mytype

পরিবর্তে

typedef NamespaceFirst::NameSpaceNested::Meow::mytype

এই বাক্য গঠনটি কেবল নামস্থানগুলির জন্য কাজ করে, ক্লাস, প্রকারের পরে অন্তর্ভুক্ত করতে পারে না namespace NAME =


3

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

namespace A {
    int foo;
    namespace AA {
        int bar;
    } // namespace AA
    namespace AB {
        int bar;
    } // namespace AB
} // namespace A
namespace B {
    int foo;
    namespace BA {
        int bar;
    } // namespace BA
    namespace BB {
        int bar;
    } // namespace BB
} // namespace B

bool nsChooser1, nsChooser2;
// ...

// This doesn't work.
namespace C = (nsChooser1 ? A : B);
C::foo = 3;

// Neither does this.
// (Nor would it be advisable even if it does work, as compound if-else blocks without braces are easy to inadvertently break.)
if (nsChooser1)
    if (nsChooser2)
        using namespace A::AA;
    else
        using namespace A::AB;
else
    if (nsChooser2)
        using namespace B::BA;
    else
        using namespace B::BB;

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

// Using the above namespaces...
int& foo = (nsChooser1 ? A::foo : B::foo);

int* bar;
if (nsChooser1) {
    if (nsChooser2) {
        bar = &A::AA::bar;
    } else {
        bar = &A::AB::bar;
    }
} else {
    if (nsChooser2) {
        bar = &B::BA::bar;
    } else {
        bar = &B::BB::bar;
    }
}

উপরের উপযোগিতা সীমিত হতে পারে তবে এটি উদ্দেশ্যটি পরিবেশন করা উচিত।

(উপরের যে কোনও টাইপটি আমি মিস করেছি তার জন্য আমার ক্ষমা প্রার্থনা)


0

নামের দ্বন্দ্ব রোধ করতে নেমস্পেস ব্যবহার করা হয়।

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

namespace foo {
    class bar {
        //define it
    };
}

namespace baz {
    class bar {
        // define it
    };
}

আপনার কাছে এখন দুটি ক্লাসের নেম বার রয়েছে যা সম্পূর্ণ আলাদা এবং নেমস্পেসিংয়ের জন্য পৃথক ধন্যবাদ।

আপনি যে "নেমস্পেসটি ব্যবহার করছেন" তা হ'ল যাতে আপনাকে সেই নেমস্পেসের মধ্যে ক্লাসগুলি ব্যবহার করার জন্য নেমস্পেস নির্দিষ্ট করতে হবে না। যেমন স্টাড :: স্ট্রিং স্ট্রিং হয়ে যায়।

আমার সংস্থান: https://www.quora.com/What-is-namespace-in-C++-1

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