SORU
13 HAZİRAN 2012, ÇARŞAMBA


Satır içi ad nedir?

C 11 tüm üyeleri aynı zamanda otomatik olarak namespaceçevreleyen. inline namespace ler, sağlar. Bu yararlı bir uygulama düşünemiyorum. birisi inline namespace ihtiyaç duyulan ve en deyimsel çözüm olduğu durumda, kısa, kısa ve öz bir örnek verebilir misiniz?

(Ayrıca, bana açık ne namespace inline ilan olur farklı dosyalar içinde canlı olan tüm tanımlamalar, ama içinde değil. Sorun için yalvarıyor bu?) değil mi

CEVAP
13 HAZİRAN 2012, ÇARŞAMBA


Satır içi ad kitaplığı sürüm oluşturma özelliği symbol versioning, benzer vardır fakat sadece C 11 seviye (örn. uygulanan belirli bir ikili yürütülebilir bir özellik olmak yerine çapraz platform) biçimi (örn. özel platform).

Bir mekanizma tarafından bir kütüphane yazar yapabilir iç içe geçmiş bir ad bakmak ve hareket gibi tüm beyannameleri ... ... çevredeki ad (satır içi ad olabilir iç içe, yani "daha fazla iç içe" adları süzülme kadar ilk olmayan satır içi ad ve bakmak ve hareket gibi kendi tanımlamalar edildi herhangi bir ad arasında, çok).

Örnek olarak, vector STL uygulama düşünün. Eğer C başından satır içi ad olsaydı , o zaman C 98 başlık <vector> Bu gibi görünebilir:

namespace std {

#if __cplusplus < 1997L // pre-standard C  
    inline
#endif

    namespace pre_cxx_1997 {
        template <class T> __vector_impl; // implementation class
        template <class T> // e.g. w/o allocator argument
        class vector : __vector_impl<T> { // private inheritance
            // ...
        };
    }
#if __cplusplus >= 1997L // C  98/03 or later
                         // (ifdef'ed out b/c it probably uses new language
                         // features that a pre-C  98 compiler would choke on)
#  if __cplusplus == 1997L // C  98/03
    inline
#  endif

    namespace cxx_1997 {

        // std::vector now has an allocator argument
        template <class T, class Alloc=std::allocator<T> >
        class vector : pre_cxx_1997::__vector_impl<T> { // the old impl is still good
            // ...
        };

        // and vector<bool> is special:
        template <class Alloc=std::allocator<bool> >
        class vector<bool> {
            // ...
        };

    };

#endif // C  98/03 or later

} // namespace std

__cplusplus, ya vector diğer uygulama değerine bağlı olarak seçilir. Eğer kod temeli yazılmış pre-C 98 kez, bulduğunuz C 98 sürümü vector neden bir sorun için size zaman yükseltme derleyici, "" yapacağınız tek şey bulmak başvuruları std::vector kod temeli ve bunları yerine göre std::pre_cxx_1997::vector.

Gel sonraki standart ve STL satıcı sadece tekrarlar yordamı yeniden, karşınızda yeni bir ad std::vector emplace_back desteği (gerektirir C 11) ve satır içi uygulaması bir ıff __cplusplus == 201103L.

TAMAM, öyleyse neden bunun için yeni bir dil özelliği gerekiyor mu? Zaten aşağıda aynı etkiye sahip yazabilirim, değil mi?

namespace std {

    namespace pre_cxx_1997 {
        // ...
    }
#if __cplusplus < 1997L // pre-standard C  
    using namespace pre_cxx_1997;
#endif

#if __cplusplus >= 1997L // C  98/03 or later
                         // (ifdef'ed out b/c it probably uses new language
                         // features that a pre-C  98 compiler would choke on)

    namespace cxx_1997 {
        // ...
    };
#  if __cplusplus == 1997L // C  98/03
    using namespace cxx_1997;
#  endif

#endif // C  98/03 or later

} // namespace std

__cplusplus, değerine bağlı olarak elde uygulamaların ikisi birbirinden tamamen farklı şeyler.

Ve neredeyse doğru olurdu.

C 98 aşağıdaki geçerli bir kullanıcı kodu (tam C 98 zaten ad std canlı şablonları uzmanlaşmak için izin verildi) göz önünde bulundurun:

// I don't trust my STL vendor to do this optimisation, so force these 
// specializations myself:
namespace std {
    template <>
    class vector<MyType> : my_special_vector<MyType> {
        // ...
    };
    template <>
    class vector<MyOtherType> : my_special_vector<MyOtherType> {
        // ...
    };
    // ...etc...
} // namespace std

Bu tamamen geçerli bir kod kullanıcı kaynakları kendi uygulama vektör kümesi girildiği anlaşılan o bilir bir daha verimli bir şekilde yerine getirilmesi daha bir tane bulduk (onun kopyası) STL.

Ama: Şablon uzmanlaşmış, bu yüzden ilan edildi ad yapmak gerekir. Standart vector std Bu kullanıcı haklı olarak bu tip uzmanlaşmak için bekliyor nerede ad bildirilmiş diyor.

Bu kod çalışır bir sürüm bilgisi olmayan ad std veya C 11 satır içi ad özelliği, fakat bu sürüm hile kullanılan using namespace <nested>, çünkü o gösterir Uygulama Detayları gerçek ad vector tanımlanmamış std doğrudan.

Hangi iç içe ad (bkz aşağıya yorum) tespit edebilirsin diğer delikleri vardır, ama içi ad hepsini tak. Ve işte bu kadar. Son derece yararlı için gelecek, ama AFAIK Standart değil reçete satır içi ad alanı adları için kendi standart kütüphane (isterim kanıtlanmadı bunun yanlış olsa da), bu nedenle sadece kullanılan üçüncü parti kütüphaneler, standart kendisi (tabii derleyici satıcıları katılıyorum bir adlandırma şeması).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EEVblog2

    EEVblog2

    2 HAZİRAN 2014
  • Jared Busch

    Jared Busch

    25 Mayıs 2011
  • Joshua Benedict

    Joshua Bened

    26 EKİM 2013