Üstbilgi içinde C ++ 'da yuvalanmış ad alanlarını ifade etmenin daha iyi bir yolu var mı?


99

C ++ 'dan Java ve C #' a geçtim ve ad alanlarının / paketlerinin kullanımının burada çok daha iyi olduğunu düşünüyorum (iyi yapılandırılmış). Sonra C ++ 'ya geri döndüm ve ad alanlarını aynı şekilde kullanmaya çalıştım ancak gerekli sözdizimi başlık dosyasında korkunç.

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

Aşağıdakiler de bana garip geliyor (derin girintiyi önlemek için):

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

Yukarıdaki şeyi ifade etmenin daha kısa bir yolu var mı? Gibi bir şey özlüyorum

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

Güncelleme

Tamam, bazıları Java / C # ve C ++ 'da kullanım kavramının farklı olduğunu söylüyor. Gerçekten mi? (Dinamik) sınıf yüklemesinin ad alanlarının tek amacı olmadığını düşünüyorum (bu çok teknik gerekçeli bir bakış açısıdır). Okunabilirlik ve yapılandırma için neden kullanmayayım, örneğin "IntelliSense" i düşünün.

Şu anda, bir ad alanı ile orada bulabilecekleriniz arasında mantık / tutkal yoktur. Java ve C # bunu çok daha iyi yapar ... Neden <iostream>ad alanı dahil edilsin ve var std? Tamam, mantığın dahil edilecek başlığa dayanması gerektiğini söylüyorsanız, #include neden #include <std::io::stream>veya gibi "IntelliSense" dostu bir sözdizimi kullanmıyor <std/io/stream>? Varsayılan kitaplıklardaki eksik yapılanmanın Java / C # ile karşılaştırıldığında C ++ 'nın bir zayıflığı olduğunu düşünüyorum.

Hırslı çatışmaların benzersizliği bir Nokta ise (ki bu da C # ve Java'nın bir noktasıdır), proje adını veya şirket adını ad alanı olarak kullanmak iyi bir fikirdir, öyle değil mi?

Bir yandan C ++ 'nın en esnek olduğu söyleniyor ... ama herkes "bunu yapma" mı dedi? Bana öyle geliyor ki C ++ pek çok şey yapabilir ancak C # ile karşılaştırıldığında çoğu durumda en kolay şeyler için bile korkunç bir sözdizimine sahiptir.

Güncelleme 2

Çoğu kullanıcı, iki Düzeyden daha derin bir yuvalama oluşturmanın saçma olduğunu söylüyor. Tamam, peki ya Windows :: UI :: Xaml ve Windows :: UI :: Xaml :: Controls :: Win8 geliştirmesindeki Primitives ad alanları? Bence Microsoft'un ad alanlarını kullanması mantıklı ve gerçekten de 2 Düzeyden daha derin. Bence daha büyük kütüphaneler / projeler daha derin bir yuvaya ihtiyaç duyar (ExtraLongClassNameBecauseEveryThingIsInTheSameNameSpace gibi sınıf isimlerinden nefret ederim ... o zaman her şeyi global ad alanına da koyabilirsiniz.)

Güncelleme 3 - Sonuç

Çoğu "bunu yapma" der, ancak ... güçlendirme bile bir veya iki seviyeden daha derin bir yuvaya sahiptir. Evet, bu bir kitaplıktır ancak: Yeniden kullanılabilir kod istiyorsanız - kendi kodunuza başka birine vereceğiniz bir kitaplık gibi davranın. Ayrıca ad alanlarını kullanarak keşif amacıyla daha derin bir yuvalama kullanıyorum.


3
namespaceAnahtar kelimenin kötüye kullanılması mı?
Nawaz

4
ad alanları ve c # / java modül sistemleri aynı amaca hizmet etmez, bu nedenle onları aynı şekilde kullanmaya çalışmamalısınız. ve hayır, daha basit bir sözdizimi yoktur, çünkü yapılması amaçlanmayan işleri yapmayı kolaylaştıracak bir sözdizimi sağlamanın bir anlamı yoktur.
PlasmaHH

@PlasmaHH ... yani zayıflık C ++ 'ın std libinin eksik yapılandırması mı? (güncellemedeki basit
örneğime bakın

@Stegi: Neden eksik olduğu ve böyle bir yapılanmadan ne kadar sağlam faydalar elde edeceğimiz konusunda sağlam argümanlar verebilirseniz, potansiyel zayıflıklardan bahsedebiliriz. O zamana kadar, en iyi ihtimalle kafa karıştırıcı olan javas paketlerinin sonsuz iç içe geçmesi derdim.
PlasmaHH

3
@PlasmaHH Intellisense ve başlık (paket) eklenmesi için / sonrasında diğer yardımcılar. Bir şirket içindeki Büyük Projeler, bir ad alanının hangi "kapsamda" ne içerdiğini net bir şekilde ifade etmek için birden fazla yuvaya (örneğin vw :: golflib :: io) ihtiyaç duyabilir. Pekala, sadece vw :: kullanabilirsiniz, ancak ad alanı çatışmalardan kaçınmak için kullanılacaksa, neden ilan etmesi bu kadar korkunç? Bu, kimsenin onu kullanmadığı veya sadece bir derinlikte ad alanını kullanmadığı bir noktaya kadar sona erer (genellikle önerildiği gibi).
Beachwalker

Yanıtlar:


135

C ++ 17, iç içe geçmiş ad alanı tanımını basitleştirebilir:

namespace A::B::C {
}

eşdeğerdir

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

Cppreference adresindeki ad alanı sayfasında (8) 'e bakın:
http://en.cppreference.com/w/cpp/language/namespace


5
... derleyici anahtarı tarafından etkinleştirildi/std:c++latest
sunny moon

4
Not, kullanmak eğer o /std:c++latestbazı Boost başlıklarını içerir zaman Visual Studio 2015 ve ayrıca Boost'u kullanmak, çok mistik derleyici hatalarla karşılaşabilirsiniz. Bu StackOverflow sorusunda
Vivit

1
A :: B :: C ad alanı olduğu gibi çalışır. G ++ - 6.0
ervinbosenbacher


17

Peterchen'in cevabını tamamen destekliyorum ama sorunuzun başka bir kısmına hitap eden bir şey eklemek istiyorum.

İsim alanlarını bildirmek, C ++ 'da #defines kullanımını sevdiğim çok nadir durumlardan biridir .

#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

Bu aynı zamanda ad alanının kapanış parantezinin yanında yorum yapma ihtiyacını da ortadan kaldırır (Daha önce büyük bir kaynak dosyanın altına kaydırıp hangi parantezin hangi kapsamı kapattığına ilişkin yorumları eksik olan parantezleri eklemeyi / kaldırmayı / dengelemeyi denediniz mi? .).

MY_COMPANY_BEGIN
MY_LIBRARY_BEGIN

class X { };

class Y { };

MY_LIBRARY_END
MY_COMPANY_END

Tüm ad alanı bildirimlerini tek bir satıra koymak istiyorsanız, bunu biraz (oldukça çirkin) önişlemci sihri ile de yapabilirsiniz:

// 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__)

Şimdi bunu yapabilirsiniz:

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;

Üç seviyeden daha derin yuvalama için, istenen sayıya kadar yardımcı makrolar eklemeniz gerekir.


Sevmediğim #definekadarıyla, bu önişlemci büyüsünden oldukça etkilendim ... sadece daha derin yuvalama için ek yardımcı makrolar eklemem gerekmiyorsa ... peki, yine de kullanmayacağım .. .
galdin

13

C ++ ad alanları, bileşenleri bölmek veya politik bölünmeyi ifade etmek için değil, arabirimleri gruplamak için kullanılır.

Standart, ad alanlarının Java benzeri kullanımını yasaklamak için yolunun dışına çıkıyor. Örneğin, ad alanı takma adları , iç içe geçmiş veya uzun ad alanı adlarını kolayca kullanmanın bir yolunu sağlar.

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

namespace nsc = a::b::c;

Ancak namespace nsc {}bu durumda bir hata olur, çünkü bir ad alanı yalnızca orijinal ad alanı adı kullanılarak tanımlanabilir . Esasen kolay için standart markaları şeyler kullanıcıya için böyle bir kütüphanenin ama sert uygulayıcısı . Bu, insanları bu tür şeyler yazmaktan caydırır, ancak yazarlarsa etkilerini azaltır.

Her arabirim için bir dizi ilişkili sınıf ve işlev tarafından tanımlanan bir ad alanına sahip olmalısınız. Dahili veya isteğe bağlı alt arabirimler, iç içe geçmiş ad alanlarına gidebilir. Ancak iki seviyeden fazla derinlik çok ciddi bir kırmızı bayrak olmalıdır.

::Operatörün gerekli olmadığı durumlarda alt çizgi karakterleri ve tanımlayıcı önekleri kullanmayı düşünün .


17
Tamam, peki ya Windows :: UI :: Xaml ve Windows :: UI :: Xaml :: Controls :: Win8 geliştirmede Primitives ad alanları? Bence Microsoft'un ad alanlarını kullanması mantıklı ve gerçekten de 2 Düzeyden daha derin.
Beachwalker

2
2'den az seviyenin kullanılması kırmızı bir işarettir ve 3 veya 4'ün kullanılması tamamen iyidir. Mantıklı olmadığında düz bir ad alanı hiyerarşisi elde etmeye çalışmak, ad çatışmalarından kaçınarak ad alanlarının amacını ortadan kaldırır. Bir arayüz için bir seviye ve alt arayüzler ve iç kısımlar için başka bir seviyeniz olması gerektiğini kabul ediyorum. Ancak bunun etrafında şirket ad alanı için (küçük ila orta ölçekli şirketler için) veya şirket ve bölüm için (büyük şirketler için) en az bir düzey daha gerekir. Aksi takdirde, arayüz ad alanlarınız, başka bir yerde geliştirilen aynı ada sahip diğer arayüzlerden olanlarla
çakışacaktır

Teknik avantajı @Kaiserludi nedir company::divisionover company_division?
Potatoswatter

@Potatoswatter Inside company :: anotherDivsion sadece daha kısa olan 'bölümü' kullanabilirsiniz. 'ad alanı kullanarak' üst düzey ad alanlarını kirletmekten kesinlikle kaçınmanız gereken üstbilgilerde bile company :: division'a atıfta bulunmak. Şirket ad alanının dışında, yine de 'ad alanı kullanan şirket' yapabilirsiniz; bölüm adları, kapsamınızdaki diğer ad alanlarıyla çakışmadığında, ancak bölüm ad alanının bazılarının içindeki arabirim adları 'ad alanını kullanma company_division;' yapamayacak şekilde çarpıştığında.
Kaiserludi

3
@Potatoswatter Önemli olan, onu pratik olarak ücretsiz olarak almanız (company :: division, company_division'dan daha uzun değildir) ve onu kullanmak için önce fazladan bir ad alanı takma adı tanımlamanıza gerek olmamasıdır.
Kaiserludi

7

Hayır, lütfen bunu yapma.

Ad alanlarının amacı, öncelikle genel ad alanındaki çatışmaları çözmektir.

İkincil bir amaç, simgelerin yerel kısaltmasıdır; örneğin, karmaşık bir UpdateUIyöntem, using namespace WndUIdaha kısa sembolleri kullanmak için bir kullanabilir.

1.3MLoc projesindeyim ve sahip olduğumuz tek ad alanları:

  • içe aktarılan harici COM kitaplıkları (esas olarak #importve arasındaki başlık çakışmalarını izole etmek için #include windows.h)
  • Belirli yönler (UI, DB erişimi vb.) İçin bir düzey "genel API" ad alanları
  • Genel API'nin parçası olmayan "Uygulama Ayrıntısı" ad alanları (.cpp'lerdeki anonim ad alanları veya ModuleDetailHereBeTygersyalnızca başlık kitaplıklarındaki ad alanları)
  • numaralandırmalar benim deneyimimdeki en büyük sorun. Deli gibi kirletiyorlar.
  • Hala çok fazla ad alanı olduğunu hissediyorum

Bu projede, sınıf adları vb. İki veya üç harfli bir "bölge" kodu kullanır (örneğin CDBNodebunun yerine DB::CNode). İkincisini tercih ederseniz, ikinci düzey "genel" ad alanları için yer vardır, ancak daha fazlası yoktur.

Sınıfa özgü numaralandırmalar vb. Bu sınıfların üyeleri olabilir (bunun her zaman iyi olmadığını kabul etsem de ve bazen yapmanız gerekip gerekmediğini söylemek zor)

İkili olarak dağıtılan 3. taraf kitaplıklarla ilgili büyük sorunlar yaşıyorsanız, kendi ad alanlarını sağlamıyorsanız ve kolayca bir ad alanına (örneğin bir ikili dosyada) eklenemiyorsanız, bir "şirket" ad alanına da nadiren ihtiyaç duyulur. dağıtım). Yine de deneyimlerime göre onları bir isim alanına zorlamak çok daha kolay.


[değiştir] Stegi'nin takip sorusuna göre:

Tamam, peki ya Windows :: UI :: Xaml ve Windows :: UI :: Xaml :: Controls :: Win8 geliştirmesindeki Primitives ad alanları? Bence Microsoft'un ad alanlarını kullanması mantıklı ve gerçekten de 2 Düzeyden daha derin

Yeterince net olamadıysam özür dilerim: İki seviye kesin bir sınır değildir ve daha fazlası özünde kötü değildir. Deneyimlerime göre, büyük bir kod tabanında bile nadiren ikiden fazlasına ihtiyacınız olduğunu belirtmek istedim . Daha derin veya daha sığ yuva yapmak bir değiş tokuştur.

Şimdi, Microsoft davası muhtemelen farklı. Muhtemelen çok daha büyük bir ekip ve tüm kod kitaplıktır.

Microsoft'un burada ad alanlarının kapsamlı kitaplığın keşfedilebilirliğine katkıda bulunduğu .NET Kitaplığı'nın başarısını taklit ettiğini varsayıyorum . (.NET'in yaklaşık 18000 türü vardır.)

Ayrıca bir isim alanında optimal (büyüklük sırası) bir sembol olduğunu varsayıyorum. Diyelim ki 1 mantıklı değil, 100 ses doğru, 10000 çok açık.


TL; DR: Bu bir değiş tokuş ve elimizde kesin rakamlar yok. Güvenli oynayın, hiçbir yönde aşırıya kaçmayın. "Bunu yapma" sadece "Bununla ilgili sorunların var, bununla sorunlar yaşarım ve buna neden ihtiyacın olacağına dair bir neden göremiyorum" dan gelir.


8
Tamam, peki ya Windows :: UI :: Xaml ve Windows :: UI :: Xaml :: Controls :: Win8 geliştirmede Primitives ad alanları? Bence Microsoft'un ad alanlarını kullanması mantıklı ve gerçekten de 2 Düzeyden daha derin.
Beachwalker

2
Global erişim sabitlerine ihtiyacım varsa, onları gibi bir adla bir ad alanına koymayı Constants, ardından sabitleri kategorize etmek için uygun adlarla iç içe geçmiş ad alanları oluşturmayı seviyorum ; Gerekirse, ad çakışmalarını önlemek için daha fazla ad alanı kullanırım. Bu Constantsad alanının kendisi, programın sistem kodu için SysData. Bu, üç ya da dört ad alanlarını içeren bir tam ismini (örneğin oluşturur SysData::Constants::ErrorMessages, SysData::Constants::Ailments::Bitflagsya da SysData::Defaults::Engine::TextSystem).
Justin Time - Monica'yı Yeniden

1
Sabitlere gerçek kodda ihtiyaç duyulduğunda, bunlara ihtiyaç duyan herhangi bir işlev using, çakışan adların olasılığını en aza indirerek uygun adları getirmek için bir yönerge kullanır . Okunabilirliği geliştirdiğini ve herhangi bir kod bloğunun bağımlılıklarını belgelemeye yardımcı olduğunu görüyorum. Sabitlerin yanı sıra, mümkünse iki ad alanında ( SysData::Exceptionsve gibi SysData::Classes) denemeye ve tutmaya çalışıyorum .
Justin Time - Monica'yı Yeniden

2
Bir bütün olarak, genel durumlarda, minimum sayıda iç içe geçmiş ad alanı kullanmak en iyisidir, ancak herhangi bir nedenle (ister sabit ister değiştirilebilir, tercihen birincisi) global nesnelere ihtiyacınız varsa, birden fazla iç içe ad alanı kullanılmalıdır. hem kullanımlarını belgelemek hem de olası ad çakışmalarını en aza indirmek için bunları uygun kategorilere ayırmak.
Justin Time - Monica'yı Yeniden

2
Objektif nedenler olmadan "lütfen bunu yapmayın" için -1 (daha sonra açıklamalara rağmen). Dil, iç içe geçmiş ad alanlarını destekler ve bir projenin bunları kullanmak için iyi nedenleri olabilir. Bu tür olası nedenlerin tartışılması ve bunu yapmanın somut, nesnel dezavantajları , olumsuz oyumu tersine çevirir.
TypeIA

5

İşte Lzz (Lazy C ++) belgelerinden bir alıntı :

Lzz, aşağıdaki C ++ yapılarını tanır:

ad alanı tanımı

Adsız bir ad alanı ve tüm kapalı bildirimler kaynak dosyaya çıktı olarak verilir. Bu kural diğerlerini geçersiz kılar.

Adlandırılmış bir ad alanının adı nitelenebilir.

   namespace A::B { typedef int I; }

eşdeğerdir:

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

Elbette bu tür araçlara bağlı olan kaynakların kalitesi tartışmalı ... C ++ 'nın neden olduğu sözdizimi hastalığının birçok şekilde olabileceğini gösteren daha çok bir merak olduğunu söyleyebilirim (bende de var ...)


2

Her iki standart da (C ++ 2003 ve C ++ 11), ad alanının adının bir tanımlayıcı olduğu konusunda çok açıktır. Bu, açıkça iç içe geçmiş başlıkların gerekli olduğu anlamına gelir.

Bunun, ad alanının basit bir adının yanı sıra nitelikli tanımlayıcı yerleştirilmesine izin vermek için önemli bir şey olmadığı, ancak bazı nedenlerden dolayı buna izin verilmediğine dair izlenimim.


2

Bu makale konuyu oldukça iyi kapsamaktadır: İsim Alanı Kağıdı

Temelde bunu kaynatır. Ad alanlarınız ne kadar uzunsa, insanların using namespaceyönergeyi kullanma şansı o kadar artar .

Aşağıdaki koda bakarak bunun size zarar vereceği bir örnek görebilirsiniz:

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{};
}

Bu kod iyi derlenir, ancak, satırın açıklamasını kaldırırsanız, //using namespace def;o zaman "test etme" ad alanı belirsiz hale gelir ve adlandırma çakışmaları olur. Bu, kod tabanınızın bir 3. taraf kitaplığı ekleyerek kararlıdan kararsız duruma geçebileceği anlamına gelir.

C #, kullanmak için olsa bile using abc;ve using def;derleyici olduğunu kabul edebilir testing::myClassya da sadece myClasstek içindedir abc::testingad, ancak C ++ bu tanımaz ve bir çarpışma olarak algılanır.


0

Evet, bunu beğenmen gerekecek

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

Ancak, ad alanlarını kullanılmaması gereken bir şekilde kullanmaya çalışıyorsunuz. Bu soruyu kontrol edin , belki faydalı bulacaksınız.


0

Bu sözdizimini kullanabilirsiniz:

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 {
    ...
};

Bu sözdiziminin C ++ 98'de bile geçerli olduğunu ve iç içe geçmiş ad alanı tanımlarına sahip C ++ 17'de mevcut olana neredeyse benzer olduğunu unutmayın .

Mutlu unnesting!

Kaynaklar:


Bunun yerine daha iyi bir çözümün arandığı soruda bahsedilen dizgi budur. Şimdi, C ++ 17 ile kabul edilen cevapta belirtildiği gibi geçerli bir alternatif mevcuttur. Üzgünüz, soruyu ve cevabı okumadığınız için olumsuz oy verin.
Beachwalker

@Beachwalker sözdizimine kapılmayalım. Yukarıdaki ad alanı bildirimi, kabul edilen yanıtla aynı olabilir. Bu yanıtla vurgulamak istediğim ana nokta, OP'nin kaçırdığını söylediği şey ve bu ad alanı karmaşasının altında yaptığım şeydi. Görebildiğim kadarıyla herkes ad alanı içindeki her şeyi açıklamaya odaklanmış gibi görünüyor, oysa cevabım sizi iç içe geçmiş karmaşadan çıkarıyor ve eminim OP bu sözdizimini 4 yıl önce herhangi biri bu soruda bahsetmiş olsaydı takdir ederdi. ilk soruldu.
smac89

-1

[ DÜZENLE: ]
c ++ 17 iç içe geçmiş ad alanı standart bir dil özelliği olarak desteklendiğinden ( https://en.wikipedia.org/wiki/C%2B%2B17 ). Şu an itibariyle bu özellik g ++ 8'de desteklenmemektedir, ancak clang ++ 6.0 derleyicisinde bulunabilir.


[SONUÇ:]
Kullanımclang++6.0 -std=c++17 Varsayılan derleme komutunuz olarak . O zaman her şey yolunda gitmeli - ve ile derleyebileceksiniznamespace OuterNS::InnerNS1::InnerNS2 { ... } dosyalarınızda .


[ORİJİNAL CEVAP:]
Bu soru biraz eski olduğu için, devam ettiğinizi varsayacağım. Ancak hala bir cevap arayan diğerleri için şu fikri buldum:

Ana dosyayı, ad alanı dosyalarını, derleme komutunu / sonucunu ve komut satırı yürütmesini gösteren Emacs arabellekleri.

(Burada Emacs için bir reklam yapabilir miyim :)?) Bir resim göndermek, kodu postalamaktan çok daha kolay ve daha okunaklı. Tüm köşe vakalarının tam bir cevabını vermek niyetinde değilim, sadece biraz ilham vermek istedim. (C # 'ı tamamen destekliyorum ve çoğu durumda C ++' nın bazı OOP özelliklerini benimsemesi gerektiğini düşünüyorum, çünkü C # esas olarak karşılaştırılan kullanım kolaylığı nedeniyle popülerdir).


Güncelleme: C ++ 17 iç içe ad alanına sahip olduğundan ( nuonsoft.com/blog/2017/08/01/c17-nested-namespaces ), eski C ++ sürümlerini kullanmadığınız sürece cevabım artık alakalı değil gibi görünüyor. .
ワ イ き ん ぐ

1
Emacs'i sevdiğim kadarıyla, bir resim göndermek ideal değil. Metin arama / indekslemeden kaçınır ve ayrıca görme engelli ziyaretçiler için cevabınıza erişimi zorlaştırır.
Heinrich Monica'yı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.