2010-02-08 22 views
27

Kitaplığı paketlemek istiyorum Kullanıcının kullanımını kolaylaştırmak için yalnızca bir başlık kitaplığı olarak çalışıyorum. (Bu küçük ve ayrı bir çeviri birimine koymak için hiçbir sebep yok) Ancak, kodumu başlıklara koyamıyorum çünkü bu C++ 'nın bir tanım kuralını ihlal ediyor. (Kitaplık üstbilgisinin bir istemci projesinin birden çok çeviri birimine eklendiği varsayılarak)Yalnızca üstbilgi kütüphanesi nasıl oluşturabilirim?

Bir kitaplık sadece nasıl başlık oluşturacak şekilde değiştirilir?

cevap

45

Sen inline anahtar kelime kullanabilirsiniz:

// header.hpp (included into multiple translation units) 

void foo_bad() {} // multiple definitions, one in every translation unit :(

inline void foo_good() {} // ok :) 

inline bağlayıcı basitçe bir tanımını seçerek diğerlerini atmak için izin verir.

, bir kenara, üye fonksiyonlar bir sınıf tipi içinde tanımlanan gibi


(bu tanımlamalar aslında uymuyorsa Gibi, sen! ... tanımsız davranış iyi bir doz almak) örtülü inline işaretlenir:

struct myclass 
{ 
    void i_am_inline_implicitly() 
    { 
     // because my definition is here 
    } 

    void but_i_am_not(); 
    void neither_am_i(); 
}; 

inline void myclass::but_i_am_not() 
{ 
    // but that doesn't mean my definition cannot be explicitly inline 
} 

void myclass::neither_am_i() 
{ 
    // but in this case, no inline for me :(
} 
+4

+1 benden. Bu, modern derleyiciler için hemen hemen tüm satır içi araçlardır. –

+0

Nitpick: ODR'nin bozulmasına izin vermez; fonksiyonun birden çok kez tanımlanmasına izin verir. Tanımlar yine de eşleşmeli. –

+0

@BillyONeal: İyi bir nitpick. Düzenlenen. – GManNickG

1

Tek bir yerde derlenen parçalar için üstbilgi korumalarını kullanın.

+4

Üstbilgiler yalnızca çeviri birimi başına çalışır. – GManNickG

+0

@GMan: Daha fazlasına ihtiyacınız var? –

+8

Peki ben seni bilmiyorum; ama projelerim birden fazla dosyadan oluşuyor. – GManNickG

6

Kullanım başlık korumaları Liz anlaşılacağı ve işlevleri yöntemleri önce "inline" koymak unutmayın olarak.

Ayrıca

#ifndef MY_HEADER_H_ 
#define MY_HEADER_H_ 

inline RetType FunctionName(ParamType1 param1, ParamType2 param2) 
{ 
    // Function body 
    return retType; 
} 

#endif 
+0

Nitelik: C++ 'da, yöntem olarak bir şey yoktur. Üye fonksiyonları ve üye olmayan fonksiyonları vardır. –

+1

@BillyONeal Bu doğru değil; Stroustrups "C++ Programlama Dili" sayfa 587'de okuyabileceğiniz gibi, sanal üye işlevleri "bazen yöntem olarak adlandırılır". –

4

yani ben size yalnızca üstbilgi-kütüphane kodunda global değişkenler veya statik değişken herhangi kullanımını önlemek gerekir düşünüyorum.

İlgili konular