শিরোনামের মধ্যে সি ++ এ নেস্টেড নেমস্পেসগুলি প্রকাশ করার জন্য আরও ভাল উপায় কি?


100

আমি সি ++ থেকে জাভা এবং সি # তে স্যুইচ করেছি এবং মনে করি সেখানে নামস্থান / প্যাকেজগুলির ব্যবহার আরও ভাল (ভাল কাঠামোগত)। তারপরে আমি সি ++ এ ফিরে এসে একইভাবে নেমস্পেসগুলি ব্যবহার করার চেষ্টা করেছি তবে শিরোনাম ফাইলের মধ্যে প্রয়োজনীয় সিনট্যাক্সটি ভয়ঙ্কর।

namespace MyCompany
{
    namespace MyModule
    {
        namespace MyModulePart //e.g. Input
        {
            namespace MySubModulePart
            {
                namespace ...
                {
                    public class MyClass    

নিম্নলিখিতটি আমার কাছেও অদ্ভুত বলে মনে হচ্ছে (গভীর ইনডেন্ট এড়ানোর জন্য):

namespace MyCompany
{
namespace MyModule
{
namespace MyModulePart //e.g. Input
{
namespace MySubModulePart
{
namespace ...
{
     public class MyClass
     {

উপরোক্ত বিষয়টি প্রকাশ করার জন্য কি আরও একটি ছোট উপায় আছে? আমি এরকম কিছু মিস করছি

namespace MyCompany::MyModule::MyModulePart::...
{
   public class MyClass

হালনাগাদ

ঠিক আছে, কেউ বলেছেন জাভা / সি # এবং সি ++ এ ব্যবহারের ধারণাটি ভিন্ন। সত্যি? আমি মনে করি (গতিশীল) শ্রেণি লোডিং কেবলমাত্র নামস্থানগুলির জন্য উদ্দেশ্য নয় (এটি একটি খুব প্রযুক্তিগত যুক্তিযুক্ত দৃষ্টিভঙ্গি)। আমি কেন এটি পঠনযোগ্যতা এবং কাঠামোগত ব্যবহারের জন্য ব্যবহার করব না, যেমন "ইন্টেলিজেন্স" ভাবেন।

বর্তমানে, কোনও নেমস্পেস এবং সেখানে আপনি কী খুঁজে পেতে পারেন তার মধ্যে কোনও যুক্তি / আঠালো নেই। জাভা এবং সি # এটি আরও ভাল করে ... কেন নাম স্থান সহ <iostream>এবং থাকার std? ঠিক আছে, যদি আপনি বলে যুক্তিবিজ্ঞান হেডার উপর নির্ভর করা উচিত নয় অন্তর্ভুক্ত করা কেন #include মত একটি "IntelliSense" বন্ধুত্বপূর্ণ সিনট্যাক্স ব্যবহার না করে #include <std::io::stream>বা <std/io/stream>? আমি মনে করি জাভা / সি # এর তুলনায় ডিফল্ট লাইবগুলিতে হারিয়ে যাওয়া কাঠামোগত C ++ এর একটি দুর্বলতা।

যদি বিবাদ বিবাদের পক্ষে স্বতন্ত্রতা এক পয়েন্ট হয় (যা সি # এবং জাভাও একটি বিন্দু) তবে প্রকল্পের নাম বা সংস্থার নামটিকে নামস্থান হিসাবে ব্যবহার করা ভাল ধারণা, আপনি কি তা মনে করেন না?

একদিকে বলা হয়ে থাকে যে সি ++ সবচেয়ে নমনীয় ... তবে সবাই বলেছে "এটি করবেন না"? আমার কাছে মনে হচ্ছে সি ++ অনেক কিছু করতে পারে তবে সি # এর তুলনায় অনেক ক্ষেত্রে সর্বাধিক সহজ জিনিসগুলির জন্য এমনকি একটি ভয়ঙ্কর বাক্য গঠন রয়েছে।

আপডেট 2

বেশিরভাগ ব্যবহারকারী বলেছেন দুটি স্তরের চেয়ে আরও গভীর নীড় তৈরি করা বাজে কথা। ঠিক আছে, তাহলে উইন্ডোজ :: ইউআই :: জ্যামাল এবং উইন্ডোজ :: ইউআই :: এক্সামল :: নিয়ন্ত্রণগুলি :: উইন 8 বিকাশের প্রিমিটিভস নেমস্পেস? আমি মনে করি মাইক্রোসফ্টের নেমস্পেসের ব্যবহারটি অর্থবোধ করে এবং এটি সত্য মাত্র 2 স্তরের চেয়ে গভীর। আমি মনে করি বড় লাইব্রেরি / প্রকল্পগুলির আরও গভীর বাসা বাঁধার দরকার (আমি এক্সট্রাওলংক্লাসনেমব্যাকজ্যাওয়ারি থাইটিংআইসইসনেমনেসস্পেসের মতো শ্রেণির নামগুলি ঘৃণা করি ... তবে আপনি সমস্ত কিছু বিশ্বব্যাপী নেমস্পেসেও স্থাপন করতে পারেন))

আপডেট 3 - উপসংহার

বেশিরভাগ বলে "এটি করবেন না", তবে ... এমনকি বুস্টের আরও গভীর বাসা বাঁধতে থাকে তবে এক বা দুটি স্তর থাকে। হ্যাঁ, এটি একটি গ্রন্থাগার তবে: আপনি যদি পুনঃব্যবহারযোগ্য কোড চান - আপনার নিজের কোডটিকে লাইব্রেরির মতো আচরণ করুন আপনি অন্য কাউকে দেবেন। নেমস্পেসগুলি ব্যবহার করে আবিষ্কারের উদ্দেশ্যে আমি আরও গভীর বাসা ব্যবহার করি।


4
এটি namespaceকীওয়ার্ডের অপব্যবহার ?
নওয়াজ

4
নেমস্পেস এবং সি # / জাভা মডিউল সিস্টেমগুলি একই উদ্দেশ্যে কাজ করে না, যেমন আপনার সেগুলি একইভাবে ব্যবহার করার চেষ্টা করা উচিত নয়। এবং না, কোনও সরল বাক্য গঠন নেই, কেবল জিনিসটিকে সহজ করার জন্য একটি সিনট্যাক্স সরবরাহ করার কোনও অর্থ হয় না, যা করণীয় নয়।
প্লাজমাএইচএইচ

@ প্লাজমাএইচএইচ ... সুতরাং দুর্বলতা হ'ল সি ++ এর স্ট্যান্ড লিবের কাঠামোগত অনুপস্থিত? (আপডেটের মধ্যে আমার সহজ উদাহরণটি দেখুন)
বিচওয়াক্কার

@ স্টেগি: যদি আপনি যদি এটির নিখোঁজ হয়ে ওঠেন এবং এই জাতীয় কাঠামোগতকরণ থেকে আমরা কী শক্ত সুবিধা পেতে পারি তবে আপনি সম্ভাব্য দুর্বলতাগুলি নিয়ে কথা বলতে পারেন sound ততক্ষণে আমি জাভাসগুলিকে সর্বোত্তমভাবে বিভ্রান্তকারী প্যাকেজগুলির অন্তহীন নেস্টিং বলব।
প্লাজমাএইচএইচ

4
শিরোনাম (প্যাকেজ) অন্তর্ভুক্তির জন্য / পরে প্লাজমাএইচএইচ ইন্টেলিসেন্স এবং অন্যান্য সহায়ক। একটি সংস্থার মধ্যে বড় প্রকল্পগুলির একটি নেস্টিংয়ের প্রয়োজন হতে পারে (উদাঃ vw :: golflib :: io) একটি স্পেস স্টেটমেন্টের জন্য যে কোনও নেমস্পেসের মধ্যে "সুযোগ" কী রয়েছে contains ঠিক আছে, আপনি কেবল vw :: ব্যবহার করতে পারেন তবে নাম স্থান যদি সংঘর্ষ এড়ানোর জন্য ব্যবহৃত হয়, তবে এত ভয়ঙ্কর ঘোষনা কেন? এটি এমন এক বিন্দুতে শেষ হয় যে নুন এটি ব্যবহার করে না বা কেবল একটির গভীরতার (যেমন প্রায়শই প্রস্তাবিত হয়) নামস্থান ব্যবহার করে।
বিচওয়াকার

উত্তর:


135

সি ++ 17 নেস্টেড নেমস্পেস সংজ্ঞাটি সহজ করতে পারে:

namespace A::B::C {
}

সমতুল্য

namespace A { namespace B { namespace C {
} } }

সিপ্রেফারেন্সে নেমস্পেস পৃষ্ঠায় (8) দেখুন:
http://en.cppreferences.com/w/cpp/language/namespace


5
... সংকলক সুইচ দ্বারা সক্ষম হয়েছে/std:c++latest
রৌদ্র চাঁদ

4
দ্রষ্টব্য, আপনি যদি /std:c++latestভিজ্যুয়াল স্টুডিও 2015 ব্যবহার করেন এবং বুস্ট ব্যবহার করেন তবে আপনি কিছু বুস্ট শিরোনাম অন্তর্ভুক্ত করার সময় খুব রহস্যময় সংকলক ত্রুটির মুখোমুখি হতে পারেন। এই স্ট্যাকওভারফ্লো প্রশ্নটিতে
ভিভিট

4
এটি যেমন, নেমস্পেস এ :: বি :: সি হিসাবে কাজ করে। আমি জি ++ - 6.0
এরভিনবোসেনব্যাকার


17

আমি পিটারচেনের উত্তরটিকে সম্পূর্ণ সমর্থন করি তবে এমন কিছু যুক্ত করতে চাই যা আপনার প্রশ্নের অন্য একটি অংশকে সম্বোধন করে।

নেমস্পেসগুলি ঘোষণা করা সি ++ এর মধ্যে একটি খুব বিরল ক্ষেত্রে যেখানে আমি আসলে #defineএস ব্যবহার করতে পছন্দ করি ।

#define MY_COMPANY_BEGIN  namespace MyCompany { // begin of the MyCompany namespace
#define MY_COMPANY_END    }                     // end of the MyCompany namespace
#define MY_LIBRARY_BEGIN  namespace MyLibrary { // begin of the MyLibrary namespace
#define MY_LIBRARY_END    }                     // end of the MyLibrary namespace

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

MY_COMPANY_BEGIN
MY_LIBRARY_BEGIN

class X { };

class Y { };

MY_LIBRARY_END
MY_COMPANY_END

আপনি যদি সমস্ত নেমস্পেসের ঘোষণাগুলি একটি লাইনে রাখতে চান তবে আপনি কিছুটা (বেশ কুৎসিত) প্রিপ্রোসেসর যাদু দ্বারা এটি করতে পারেন:

// helper macros for variadic macro overloading
#define VA_HELPER_EXPAND(_X)                    _X  // workaround for Visual Studio
#define VA_COUNT_HELPER(_1, _2, _3, _4, _5, _6, _Count, ...) _Count
#define VA_COUNT(...)                           VA_HELPER_EXPAND(VA_COUNT_HELPER(__VA_ARGS__, 6, 5, 4, 3, 2, 1))
#define VA_SELECT_CAT(_Name, _Count, ...)       VA_HELPER_EXPAND(_Name##_Count(__VA_ARGS__))
#define VA_SELECT_HELPER(_Name, _Count, ...)    VA_SELECT_CAT(_Name, _Count, __VA_ARGS__)
#define VA_SELECT(_Name, ...)                   VA_SELECT_HELPER(_Name, VA_COUNT(__VA_ARGS__), __VA_ARGS__)

// overloads for NAMESPACE_BEGIN
#define NAMESPACE_BEGIN_HELPER1(_Ns1)             namespace _Ns1 {
#define NAMESPACE_BEGIN_HELPER2(_Ns1, _Ns2)       namespace _Ns1 { NAMESPACE_BEGIN_HELPER1(_Ns2)
#define NAMESPACE_BEGIN_HELPER3(_Ns1, _Ns2, _Ns3) namespace _Ns1 { NAMESPACE_BEGIN_HELPER2(_Ns2, _Ns3)

// overloads for NAMESPACE_END
#define NAMESPACE_END_HELPER1(_Ns1)               }
#define NAMESPACE_END_HELPER2(_Ns1, _Ns2)         } NAMESPACE_END_HELPER1(_Ns2)
#define NAMESPACE_END_HELPER3(_Ns1, _Ns2, _Ns3)   } NAMESPACE_END_HELPER2(_Ns2, _Ns3)

// final macros
#define NAMESPACE_BEGIN(_Namespace, ...)    VA_SELECT(NAMESPACE_BEGIN_HELPER, _Namespace, __VA_ARGS__)
#define NAMESPACE_END(_Namespace, ...)      VA_SELECT(NAMESPACE_END_HELPER,   _Namespace, __VA_ARGS__)

এখন আপনি এটি করতে পারেন:

NAMESPACE_BEGIN(Foo, Bar, Baz)

class X { };

NAMESPACE_END(Baz, Bar, Foo) // order doesn't matter, NAMESPACE_END(a, b, c) would work equally well

Foo::Bar::Baz::X x;

তিন স্তরের গভীর নীচে বাসা বাঁধার জন্য আপনাকে কাঙ্ক্ষিত গণনা পর্যন্ত সহায়ক ম্যাক্রো যুক্ত করতে হবে।


আমি যতটা অপছন্দ #defineকরি তা আমি এই প্রিপ্রোসেসর যাদু দ্বারা বেশ মুগ্ধ ... কেবলমাত্র গভীর নীড় বাঁধার জন্য যদি আমাকে অতিরিক্ত সহায়ক ম্যাক্রো যুক্ত করতে না হয় ... ভাল, আমি যাইহোক এটি এটিকে ব্যবহার করব না .. ।
গ্যালদিন

13

সি ++ নেমস্পেসগুলি গ্রুপ ইন্টারফেসে ব্যবহৃত হয়, উপাদানগুলি বিভক্ত করতে বা রাজনৈতিক বিভাগকে প্রকাশ করার জন্য নয়।

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

namespace a {
namespace b {
namespace c {}
}
}

namespace nsc = a::b::c;

তবে namespace nsc {}ত্রুটি হতে পারে কারণ একটি নেমস্পেস কেবলমাত্র তার আসল-নেমস্পেস-নামটি ব্যবহার করে সংজ্ঞায়িত করা যেতে পারে । মূলত মানটি ব্যবহারকারীর পক্ষে জিনিসগুলি সহজ করে তোলে জাতীয় লাইব্রেরির তবে প্রয়োগকারীকে শক্ত করে । এটি লোককে এ জাতীয় লেখা থেকে নিরুৎসাহিত করে তবে তারা যদি তা করে তবে প্রভাবগুলি প্রশমিত করে।

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

যেখানে ::অপারেটরের প্রয়োজন নেই সেখানে আন্ডারস্কোর অক্ষর এবং শনাক্তকারী উপসর্গ ব্যবহার বিবেচনা করুন ।


17
ঠিক আছে, তাহলে উইন্ডোজ :: ইউআই :: জ্যামাল এবং উইন্ডোজ :: ইউআই :: এক্সামল :: নিয়ন্ত্রণগুলি :: উইন 8 বিকাশের প্রিমিটিভস নেমস্পেস? আমি মনে করি মাইক্রোসফ্টের নেমস্পেসগুলির ব্যবহারটি অর্থবোধ করে এবং এটি সত্য মাত্র 2 স্তরের চেয়ে গভীর।
বিচওয়েকার

4
2 টিরও কম স্তরের ব্যবহার করা একটি লাল পতাকা এবং 3 বা 4 ব্যবহার করা পুরোপুরি ঠিক। নাম সংঘর্ষগুলি এড়ানো - কোনও ফ্ল্যাট নেমস্পেস হায়ারার্কি অর্জন করার চেষ্টা করা যখন এটি অর্থবোধ করে না তখন নামস্থানগুলির খুব উদ্দেশ্যকে পরাস্ত করে। আমি সম্মত হই যে আপনার একটি ইন্টারফেসের জন্য একটি স্তর এবং সাবিন্টারফেস এবং ইন্টার্নালগুলির জন্য অন্য একটি স্তর থাকা উচিত। তবে এর আশেপাশে আপনার কমপক্ষে আরও একটি স্তর প্রয়োজন কোম্পানির নেমস্পেসের জন্য (ছোট থেকে মাঝারি সংস্থাগুলির জন্য) বা দুটি সংস্থা এবং বিভাগের জন্য (বড় সংস্থাগুলির জন্য)। অন্যথায় আপনার ইন্টারফেসের নেমস্পেসগুলি অন্য ইন্টারফেসের একই
সংখ্যার সাথে

@ কাইসারলুদি @ company::divisionওভারের প্রযুক্তিগত সুবিধা কী company_division?
16:58

@ পোটাটোসওয়টার ইনসাইড সংস্থা :: অন্যটি ডিভেশন আপনি কেবল খাটো 'বিভাগ' ব্যবহার করতে পারেন। সংস্থা :: বিভাগকে উল্লেখ করতে এমনকি শিরোনামের মধ্যেও যেখানে আপনার 'নেমস্পেস' ব্যবহার করে উচ্চ স্তরের নেমস্পেসগুলি দূষিত করা উচিত strongly সংস্থার নেমস্পেসের বাইরে আপনি এখনও 'নেমস্পেস কোম্পানি ব্যবহার করে' করতে পারেন; যখন বিভাগের নামগুলি আপনার ক্ষেত্রের অন্য কোনও নেমস্পেসের সাথে সংঘর্ষে না আসে, তবে বিভাগের নেমস্পেসের কিছু অংশের ভিতরে ইন্টারফেসের নামগুলি এমনভাবে সংঘটিত হয় যাতে আপনি 'নেমস্পেস কোম্পানী_বিভাজন ব্যবহার করে না করতে পারেন';।
কাইসরুদ্দী

4
@ পোটাটোসওয়টার মূল কথাটি হ'ল আপনি এটি নিখরচায় (কোম্পানী :: বিভাগটি কোম্পানী_ বিভাগের চেয়ে বেশি নয়) ব্যবহার করার জন্য প্রথমে কোনও অতিরিক্ত নেমস্পেসের নাম নির্ধারণ করতে হবে না।
কায়সারলুদি

7

না, এবং দয়া করে এটি করবেন না।

নেমস্পেসের উদ্দেশ্যটি মূলত বিশ্বব্যাপী নেমস্পেসে দ্বন্দ্ব সমাধান করা।

একটি গৌণ উদ্দেশ্য হ'ল প্রতীকগুলির স্থানীয় সংক্ষেপ; উদাহরণস্বরূপ একটি জটিল UpdateUIপদ্ধতি using namespace WndUIসংক্ষিপ্ত চিহ্ন ব্যবহার করতে ব্যবহার করতে পারে ।

আমি একটি 1.3 মলোক প্রকল্পে আছি, এবং আমাদের কেবলমাত্র নামস্থানগুলি হ'ল:

  • আমদানি করা বাহ্যিক সিওএম লাইব্রেরিগুলি (মূলত #importএবং এর মধ্যে শিরোনাম বিবাদকে আলাদা করতে #include windows.h)
  • নির্দিষ্ট দিকগুলির (ইউআই, ডিবি অ্যাক্সেস ইত্যাদি) জন্য "পাবলিক এপিআই" নামের স্থানগুলির একটি স্তর
  • "বাস্তবায়ন বিশদ" নামস্থানগুলি যা সর্বজনীন API এর অংশ নয় (.cpp এর বেনামে নামস্থানগুলি, অথবা ModuleDetailHereBeTygersকেবলমাত্র শিরোনামের লিবিসে নেমস্পেস)
  • enums আমার অভিজ্ঞতার বৃহত্তম সমস্যা। তারা পাগলের মতো দূষিত হয়।
  • আমি এখনও এটি পুরোপুরি অনেক বেশি নেমস্পেস অনুভব করি

এই প্রকল্পে শ্রেণীর নাম ইত্যাদি দুটি বা তিন-বর্ণের "অঞ্চল" কোড ব্যবহার করে (যেমন CDBNodeপরিবর্তে এর পরিবর্তে DB::CNode)। আপনি যদি পরেরটি পছন্দ করেন তবে "সর্বজনীন" নেমস্পেসের দ্বিতীয় স্তরের জন্য জায়গা রয়েছে, তবে আর কিছু নেই।

শ্রেণি-নির্দিষ্ট এনাম ইত্যাদি সেই ক্লাসের সদস্য হতে পারে (যদিও আমি সম্মত হই যে এটি সর্বদা ভাল নয়, এবং আপনার উচিত কিনা তা বলা কখনও কখনও শক্ত)

"কোম্পানির" নেমস্পেসের খুব কমই দরকার হয়, যদি আপনি বাইনারি হিসাবে বিতরণ করা তৃতীয় পক্ষের লাইব্রেরিগুলিতে কোনও বড় সমস্যা হয়ে থাকেন, তাদের নিজস্ব নামস্থান সরবরাহ করেন না এবং সহজেই একটিতে স্থাপন করা যায় না (যেমন একটি বাইনারিতে) বিতরণ)। তবুও, আমার অভিজ্ঞতায় তাদের জোর করে একটি নেমস্পেসে করা খুব সহজ।


স্ট্যাগির ফলো-আপ প্রশ্ন অনুসারে [সম্পাদনা]

ঠিক আছে, তাহলে উইন্ডোজ :: ইউআই :: জ্যামাল এবং উইন্ডোজ :: ইউআই :: এক্সামল :: নিয়ন্ত্রণগুলি :: উইন 8 বিকাশের প্রিমিটিভস নেমস্পেস? আমি মনে করি মাইক্রোসফ্টের নেমস্পেসগুলির ব্যবহারটি অর্থবোধ করে এবং এটি সত্য মাত্র 2 স্তরের চেয়ে গভীর

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

এখন, মাইক্রোসফ্ট কেস যুক্তিযুক্তভাবে পৃথক। সম্ভবত অনেক বড় দল এবং সমস্ত কোড লাইব্রেরি।

আমি ধরে নেব মাইক্রোসফ্ট এখানে .NET গ্রন্থাগারের সাফল্যের অনুকরণ করছে, যেখানে নামের স্থানগুলি বিস্তৃত গ্রন্থাগারের আবিষ্কারের ক্ষেত্রে অবদান রাখে । (.NET এর প্রায় 18000 প্রকার রয়েছে))

আমি আরও ধরে নেব যে একটি নেমস্পেসে একটি অনুকূল (বিশালতার ক্রম) চিহ্ন রয়েছে। বলুন, 1 অর্থবোধ করে না, 100 টি শব্দ ঠিক, 10000 স্পষ্টভাবে অনেক কিছুই।


টিএল; ডিআর: এটি একটি ট্রেড অফ, এবং আমাদের কাছে কঠিন সংখ্যা নেই। নিরাপদে খেলুন, কোনও দিক থেকে অতিরিক্ত না don't "এটি করবেন না" কেবল "" এটির সাথে আপনার সমস্যা আছে, এটির সাথে আমার সমস্যা আছে এবং "আপনার প্রয়োজনের কোনও কারণ আমি দেখতে পাচ্ছি না" থেকে এসেছে "


8
ঠিক আছে, তাহলে উইন্ডোজ :: ইউআই :: জ্যামাল এবং উইন্ডোজ :: ইউআই :: এক্সামল :: নিয়ন্ত্রণগুলি :: উইন 8 বিকাশের প্রিমিটিভস নেমস্পেস? আমি মনে করি মাইক্রোসফ্টের নেমস্পেসগুলির ব্যবহারটি অর্থবোধ করে এবং এটি সত্য মাত্র 2 স্তরের চেয়ে গভীর।
বিচওয়েকার

4
আমার যদি গ্লোবাল-অ্যাক্সেস কনস্ট্যান্টগুলির প্রয়োজন হয় তবে আমি এগুলি নামের মতো একটি নামস্থানে রাখতে চাই Constants, তবে ধ্রুবকগুলিকে শ্রেণিবদ্ধ করার জন্য উপযুক্ত নাম সহ নেস্টেড নেমস্পেসগুলি তৈরি করতে চাই ; যদি প্রয়োজন হয় তবে আমি নামের সংঘর্ষ রোধ করতে আরও নেমস্পেস ব্যবহার করি। এই Constantsনেমস্পেসটি প্রোগ্রামের কোড কোডের মতো একটি নামের সাথে একটি ক্যাচ-অল নেমস্পেসে থাকে SysData। এই সম্পূর্ণ-যোগ্যতাসম্পন্ন নাম তিন অথবা চার নামব্যবধান ধারণকারী (যেমন সৃষ্টি SysData::Constants::ErrorMessages, SysData::Constants::Ailments::Bitflagsকিংবা SysData::Defaults::Engine::TextSystem)।
জাস্টিন সময় - মনিকা

4
যখন সত্যিকারের কোডে ধ্রুবকগুলির প্রয়োজন হয়, তাদের যে কোনও ক্রিয়াকলাপের প্রয়োজন হয় তা usingবিরোধী নামের সম্ভাবনা হ্রাস করে উপযুক্ত নামগুলি আনার জন্য একটি নির্দেশিকা ব্যবহার করে । আমি এটি পাঠযোগ্যতার উন্নতি করে এবং প্রদত্ত কোড ব্লকের নির্ভরতাগুলি ডকুমেন্ট করতে সহায়তা করে helps এছাড়াও ধ্রুবক থেকে আমি চেষ্টা করে এবং (যেমন দুই নামব্যবধান তা রাখা সম্ভব হলে SysData::Exceptionsএবং SysData::Classes)।
জাস্টিন সময় - মনিকা

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

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

5

এখানে Lzz (অলস সি ++) ডক্সের একটি উদ্ধৃতি :

Lzz নিম্নলিখিত সি ++ নির্মাণগুলি স্বীকৃত:

নেমস্পেস সংজ্ঞা

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

নামযুক্ত নামের নামটি যোগ্য হতে পারে।

   namespace A::B { typedef int I; }

সমান:

   namespace A { namespace B { typedef int I; } }

অবশ্যই এই জাতীয় সরঞ্জামগুলির উপর নির্ভর করে উত্সগুলির মানটি বিতর্কযোগ্য ... আমি বলব এটি আরও কৌতূহল, এটি দেখিয়ে যে সি ++ দ্বারা প্রেরিত সিনট্যাক্স রোগটি অনেক ফর্ম নিতে পারে (আমারও আছে আমারও ...)


2

উভয় স্ট্যান্ডার্ড (সি ++ 2003 এবং সি ++ 11) খুব স্পষ্ট করে যে নেমস্পেসের নামটি একটি সনাক্তকারী। এর অর্থ স্পষ্টভাবে নেস্টেড শিরোনাম প্রয়োজন।

আমার অনুভূতি যে নামের জায়গার সাধারণ নাম ছাড়াও যোগ্য সনাক্তকারী স্থাপনের অনুমতি দেওয়া এটি কোনও বড় বিষয় নয়, তবে কোনও কারণে এটি অনুমোদিত নয়।


2

এই কাগজটি বিষয়টিকে বরং ভালভাবে কভার করে: নেমস্পেস পেপার

যা মূলত এটিকে ফুটিয়ে তোলে। আপনার নামের জায়গাগুলি যত দীর্ঘ হবে লোকেরা এই using namespaceনির্দেশনাটি ব্যবহার করার সম্ভাবনা তত বেশি ।

সুতরাং নীচের কোডটি দেখে আপনি একটি উদাহরণ দেখতে পারেন যেখানে এটি আপনাকে আঘাত করবে:

namespace abc { namespace testing {
    class myClass {};
}}

namespace def { namespace testing {
    class defClass { };
}}

using namespace abc;
//using namespace def;

int main(int, char**) {
    testing::myClass classInit{};
}

এই কোডটি সূক্ষ্ম সংকলন করবে, তবে আপনি যদি লাইনটি অসুবিধে করেন //using namespace def; তবে "টেস্টিং" নেমস্পেসটি অস্পষ্ট হয়ে যাবে এবং আপনার নামকরণের সংঘর্ষ হবে। এর অর্থ হল যে আপনার কোড বেসটি তৃতীয় পক্ষের লাইব্রেরি অন্তর্ভুক্ত করে স্থিতিশীল থেকে অস্থির দিকে যেতে পারে।

সি #, আপনি ব্যবহার করতে ছিল এমনকি যদি using abc;এবং using def;কম্পাইলার যে স্বীকৃতি সক্ষম হয় testing::myClassবা এমনকি শুধু myClassমাত্র রয়েছে abc::testingনামস্থান কিন্তু সি ++ এই চিনতে পারবে না এবং এটি একটি সংঘর্ষের যেমন সনাক্ত করা হয়।


0

হ্যাঁ, আপনি এটি পছন্দ মত করতে হবে

namespace A{ 
namespace B{
namespace C{} 
} 
}

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


0

আপনি এই বাক্য গঠনটি ব্যবহার করতে পারেন:

namespace MyCompany {
  namespace MyModule {
    namespace MyModulePart //e.g. Input {
      namespace MySubModulePart {
        namespace ... {
          class MyClass;
        }
      }
    }
  }
}

// Here is where the magic happens
class MyCompany::MyModule::MyModulePart::MySubModulePart::MyYouGetTheIdeaModule::MyClass {
    ...
};

দ্রষ্টব্য এই বাক্য গঠনটি এমনকি সি ++ 98 তেও বৈধ এবং এটি নেস্টেড নেমস্পেস সংজ্ঞা সহ সি ++ 17 এ এখন যা পাওয়া যায় তার প্রায় একই রকম

হ্যাপি আনসেস্টিং!

সূত্র:


এটি পরিবর্তে আরও ভাল সমাধান অনুসন্ধান করা হয় যেখানে প্রশ্নে উল্লিখিত sytax হয়। এখন, সি ++ 17 সহ একটি বৈধ বিকল্প গ্রহণযোগ্য উত্তরের বিবরণ অনুসারে উপলভ্য। দুঃখিত, প্রশ্নোত্তর না পড়ার জন্য ডাউনভোট করুন।
বিচওয়াকার

@ বিচওয়াকার আসুন সিনট্যাক্স এ ধরা যাক না। উপরের নেমস্পেসের ঘোষণাটি একই সাথে গ্রহণযোগ্য উত্তরের মতো হতে পারে। এই উত্তরটি দিয়ে আমি যে মূল বক্তব্যটি হাইলাইট করতে চেয়েছিলাম সেটি হ'ল ওপি যা বলেছিল তা তিনি মিস করেছেন এবং আমি এই নামস্থানটির জগতে নীচে কী করেছি। আমি যতদূর দেখতে পাচ্ছি সবাই মনে হয় নেমস্পেসের মধ্যে সমস্ত কিছু ঘোষণার দিকে মনোনিবেশ করেছিল, যেখানে আমার উত্তর আপনাকে নেস্টেড গণ্ডগোলের বাইরে নিয়ে যায় এবং আমি নিশ্চিত যে ওপি এই বাক্য গঠনটির প্রশংসা করবে যদি 4 বছর আগে এই প্রশ্নটি কেউ উল্লেখ করেছিল প্রথম জিজ্ঞাসা করা হয়েছিল।
smac89

-1

[সম্পাদনা:]
যেহেতু সি ++ 17 নেস্টেড নেমস্পেসগুলি স্ট্যান্ডার্ড ভাষার বৈশিষ্ট্য হিসাবে সমর্থন করে ( https://en.wikedia.org/wiki/C%2B%2B17 )। এখন পর্যন্ত, এই বৈশিষ্ট্যটি g ++ 8 তে সমর্থিত নয় তবে এটি ঝনঝন ++ 6.0 সংকলকটিতে পাওয়া যাবে।


[উপসংহার:] আপনার ডিফল্ট সংকলন কমান্ড হিসাবে
ব্যবহার করুন clang++6.0 -std=c++17। তারপরে সবকিছু ঠিকঠাক কাজ করা উচিত - এবং আপনি namespace OuterNS::InnerNS1::InnerNS2 { ... }আপনার ফাইলগুলিতে সংকলন করতে সক্ষম হবেন ।


[মূল উত্তর:]
যেহেতু এই প্রশ্নটি কিছুটা পুরানো, আমি ধরে নেব যে আপনি এগিয়ে গিয়েছেন। তবে অন্যদের জন্য, যারা এখনও উত্তর খুঁজছেন, আমি নিম্নলিখিত ধারণাটি নিয়ে এসেছি:

ইম্যাক্স বাফারগুলি প্রধান ফাইল, নেমস্পেস ফাইলগুলি, সংকলন কমান্ড / ফলাফল এবং কমান্ড-লাইন সম্পাদন দেখাচ্ছে।

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


আপডেট: যেহেতু সি ++ 17 নেমস্পেসিং ( nuonsoft.com/blog/2017/08/01/c17-nested-namespaces ) নেস্ট করেছে তাই মনে হচ্ছে আমার উত্তর আর প্রাসঙ্গিক নয়, যদি আপনি সি ++ এর পুরানো সংস্করণ ব্যবহার না করেন ।
イ き ん

4
আমি ইমাসকে যতটা ভালোবাসি, একটি ছবি পোস্ট করা আদর্শ নয়। এটি পাঠ্য সন্ধান / সূচককে অন্তর্ভুক্ত করে এবং দৃষ্টি প্রতিবন্ধীদের জন্য আপনার উত্তর অ্যাক্সেস করতে শক্ত করে।
হেইনিরিচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.