2010-01-17 20 views
26

Bir başlık dosyasında bir ad alanı içinde yer alan satır içi işlevler var ve şu anda bir cpp dosyasına taşımak için bir konumda değilim. Bu satır içi işlevlerin bazıları, örneğin sihirli sabitleri kullanın:Satır içi bir üstbilgi başlığı üstbilgisinde özel sabitleri gizleme

// Foo.h 
namespace Foo 
{ 
    const int BAR = 1234; 

    inline void someFunc() 
    { 
     // Do something with BAR 
    } 
} 

Ancak, ben bu sihirli sabitler özel yapmak istiyorum - herhangi bir fikir nasıl?

// Foo.h 
namespace Foo 
{ 
    namespace 
    { 
     // 'private' constants here 
     const int BAR = 1234; 
    } 

    inline void someFunc() 
    { 
     // Do something with BAR 
    } 
} 

Ancak bu işe yaramazsa ve Foo::BARFoo.h içeren herhangi cpp dosyası mevcuttur: İlk aklıma böylece anonim ad kullanmaktı? Bir uygulama cpp dosyası oluşturmadan bunu yapmak için bir yolu var mı?

cevap

28

İsimsiz ad alanları, tanımlandıkları çeviri birimi için (veya sizin durumunuza dahil edilir) çalışamazlar.

namespace foo { 
    namespace detail { 
     int magic = 42; 
    } 

    // ... use detail::magic 
} 
+4

Bu, aynı zamanda sözleşme artırmanın kullanımlarıdır. Herkese basit, "Asla bir detay isim alanı girme" diye anladığınız sürece işe yarar. – GManNickG

3

özel ad koyun veya özel olarak onlara isim, bir proje kongre ile birlikte böyle şeylerin olmayan olduklarını:
Onların iç detaylar kullanıcıya sinyal verme detail ad taşıyarak düşünebiliriz -kamu: olmayan halk olarak belgelenmiş adlarını kullanarak

namespace foo { 
    namespace detail { // as in "implementation details" 
    inline int answer() { return 42; } 
    const int perfect = 28; 
    } 
    std::string _question(); // not part of foo's "public interface" by convention 

    int this_is_public() { 
    using namespace detail; // now don't have to prefix detail:: 
    return answer() + perfect + _question().length(); 
    } 
} 

herkes herhangi bir "koruma" Eğer denemek aşmak olur; Bu, gerçek endişeyi vurgulamaktadır: kamu arabiriminin bir parçası olanı belgelemek ve güvenilebilir.

Adsız ad alanları farklı bir sorunu çözüyor: belirli bir TU'ya özgü isimler alınıyor. Burada yardım etmeyecekler.

namespace Foo { 
    class foo_detail { 
    private: 
     enum { 
      BAR = 1234, 
     }; 

     friend void someFunc(); 
    }; 

    inline 
    void someFunc() { 
     // something with foo_detail::BAR 
    } 
} 

Bu arkadaş olarak işaretlemek fonksiyonlarından daha başkası için sürekli nonaccessible yapar: nereden

16

. Kurucuyu, hiç kimsenin dersi anlamaya çalışmadığından emin olmak için özel olarak yapılandıramazsınız.