SORU
14 NİSAN 2011, PERŞEMBE


Nasıl dll (STL) Standart Kütüphane sınıfları arayüzü ya da ABİ olabilir miyim?

Önce birkaç soru visual studio C4251 uyarmanın stl sınıfları içeren bir sınıf ihraç olmuştur: örn. bu soru bu soru. Zaten UnknownRoad mükemmel bir açıklama okudum.

Körü körüne uyarı devre dışı bırakılması bir seçenek olabilir ama biraz tehlikeli görünüyor. Tüm bu std sınıfları sarma ve bu ihracat da gerçekten bir seçenek değil. Tüm aradıktan sonraStandart... I. e. şablon Kütüphanesi bu standart sınıflar ile bir arabirim sağlamak istiyor.

Nasıl dll arayüzü benim stl-sınıflar kullanabilir miyim? Ortak uygulamaları nelerdir?

CEVAP
14 NİSAN 2011, PERŞEMBE


Bir şey daha okumadan önce unutmayın: cevabım uygulamaları modülleri farklı Derleyiciler altında derlenmiş oluşan kullanılabilecek taşınabilir kod yazma bakış açısıyla yaklaşıyor. Bu farklı sürümlerini veya aynı derleyici farklı yama seviyeleri bile içerebilir.

Nasıl benim stl-sınıflar kullanabilir miyim dll arabirimi?

Cevap:Sık sık olmaz1.

Sebep:STL kod bir kütüphane, bir DLL dosyası gibi ikili bir kütüphane değil. Kullanabileceğiniz her yerde aynı olduğu garanti olan tek bir ABİ yok. Nitekim, STL için durmak yok "StandartŞablon Kitaplığı," ama önemli operatif bir kelime Standart ayrıca buradaŞablon.

Standart yöntem ve veri üyeleri sınıf STL sağlamak için gereklidir, ve bu yöntemleri yapmak için ne tanımlar; ama artık her tanımlar. Özellikle, Standart derleyici yazarların Standart tanımlı işlevleri uygulamak gerektiğini belirtmek değil. Derleyici yazarlar üye fonksiyonlar ve üye değişkenleri ekleyen bir STL sınıfından bir uygulama sağlamak için ücretsizdirdeğilStandart olarak listelenen, çok uzun olan üyeler gibiStandart tanımlı ve Standart dediğini yap hala orada.

Belki bir örnek sağlanmasıdır. basic_string sınıfının bazı üye fonksiyonları ve değişkenleri olarak Standardı tanımlanmıştır. Gerçek tanımı bu Standart neredeyse 4 sayfası var, ama burada sadece bir parçacık

namespace std {
  template<class charT, class traits = char_traits<charT>,
    class Allocator = allocator<charT> >
  class basic_string {
[snip]
  public:
    // 21.3.3 capacity:
    size_type size() const;
    size_type length() const;
    size_type max_size() const;
    void resize(size_type n, charT c);
    void resize(size_type n);
    size_type capacity() const;
    void reserve(size_type res_arg = 0);
    void clear();
    bool empty() const;
[snip]
};

size() length() üye fonksiyonlar göz önünde bulundurun. Bu bilgileri tutmak için üye değişkenleri belirtilen Standart başka bir şey yoktur. Nitekim, üye değişkenler, bile dize kendisi tutmak için tanımlanmıştır. Bu nasıl uygulanır?

Cevap, birçok farklı yolu vardır. Bazı Derleyiciler boyutu ve char* bir dize tutmak için tutmak için size_t üye değişkeni kullanabilir. Başka bir veri (bu referans sayılan bir uygulama söz konusu olabilir) tutan bazı diğer verileri depolamak için bir işaretçi kullanın. Aslında, farklı versiyonları hattayama seviyeleriaynı derleyici değişebilir bu uygulama ayrıntıları. Onlara güvenemezsin. Yani, MSVC:

namespace std {
  template<class charT, class traits = char_traits<charT>,
    class Allocator = allocator<charT> >
  class basic_string {
[snip]
char* m_pTheString;
};

size_t basic_string::size() const { return strlen(m_pTheString;) }

...SP1 ise MSVC 10 şöyle olabilir:

namespace std {
  template<class charT, class traits = char_traits<charT>,
    class Allocator = allocator<charT> >
  class basic_string {
[snip]
vector<char> m_TheString;
};

size_t basic_string::size() const { return m_TheString.size(); }

Onlar demiyorumyapınböyle olsa diyorum. Burada önemli olan nokta, gerçek uygulama platform bağlı olduğunu, ve gerçekten başka bir yerde ne olacağını bilmenin bir yolu var.

Şimdi MSVC10 bu sınıf verir bir DLL yazmak için kullanın dediler

class MyGizmo
{
public:
  std::string name_;
};

sizeof(MyGizmo) nedir?

Önerdiğim uygulamaları yukarıda varsayarak, kendi sizeof(char*) ama altında SP1 olacak altında MSVC10 sizeof(vector<char>) olacak. Eğer DLL kullanan VC10 SP1'DE bir uygulama yazıyorsanız, nesnenin boyutunu olduğundan daha farklı görünecektir. İkili arayüzü değişti.


Bu başka bir tedavi için, lütfen bkzC Kodlama Standartları(link Amazon) # 63 sorun.


1: "Sık sık olmaz"Aslında toolchains ve kütüphaneler üzerinde tam kontrole sahip olduğunda güvenilirlik adil bir miktar ile Standart Kütüphane bileşenleri veya herhangi bir diğer kod kitaplığı bileşenleri (Boost gibi) verebilirsiniz.

Temel sorun kaynak kod Kütüphanesi olan şeylerin boyutları ve tanımları farklı derleyici ve kitaplık farklı sürümleri arasında farklı olabilir. Eğer kod kullanılır bu işler her yerde kontrol ettiği bir ortamda çalışıyorsanız, o zaman muhtemelen bir sorun olmaz. Tüm sistemler in-house yazılmış ve sadece evde kullanıldığı bir ticaret şirketinde örneğin, bunu yapmak mümkün olabilir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bmarian22

    bmarian22

    22 Aralık 2007
  • MrRandomSong

    MrRandomSong

    29 Kasım 2009
  • ShoSho

    ShoSho

    20 Ocak 2010