2015-05-09 17 views
15

Ben dcmtk kaynak kodunu okumak ve ofstdinc.h bir yorum bulundu:Ne tür başlık dosyaları, birden çok eklemeye karşı korunmamalıdır?

// this file is not and should not be protected against multiple inclusion 

Ve başlık dosyaları ne tür birden içerme karşı korunmuş olması gerekmez mi?

+1

olanlar

M(foo, "foo") M(bar, "bar") M(baz, "baz") 

Bu bir başlık m.h düşünün böyle diğer bazı başlığında kullanılabilir Bir sorunu çözmek için bir kesmek (çoklu ekleme) kullanmaya çalışmak. Kendi yeni kodunuzda, bu tür bir çözümü denemek ve bunlardan kaçınmak en iyisidir ve her zaman muhafızları kullanabilirsiniz. – pmg

cevap

12

Önişlemci meta programlaması. Yani, dahil edilen dosyayı, bazı görevleri gerçekleştiren bir tür derleme zamanı işlevi olarak kullanmaktır. İşle ilgili argümanlar makrodur. Örneğin, bağlantılı dosya şuna benzer bir bölüm vardır: Ben "ofstack.h" dahil etmek istiyorsa Yani

// define INCLUDE_STACK to include "ofstack.h" 
#ifdef INCLUDE_STACK 
#include "dcmtk/ofstd/ofstack.h" 
#endif 

, böyle bunu olacaktır:

#define INCLUDE_STACK 
#include "ofstdinc.h" 
#undef INCLUDE_STACK 

Şimdi sonra aşağı hayal çizgi, birisi başlığının bu özel bölümünü kullanmak isteyen:

// define INCLUDE_STRING to include "ofstring.h" 
#ifdef INCLUDE_STRING 
#include "dcmtk/ofstd/ofstring.h" 
#endif 

Böylece aşağıdakileri yapın:

#define INCLUDE_STRING 
#include "ofstdinc.h" 
#undef INCLUDE_STRING 

"ofstdinc.h" güvenlik görevlileri içeriyorsa, bu dahil edilmez.

+0

Gördüğüm üstbilgilerde (genellikle diğer cevaplarda olduğu gibi enumların bedenlerine yapıştırmak için kullanılır), "# undefs" başlığın kendisinde idi. Bu nedenle, üstbilginin kullanıldığı her yerde '# undef'ing kodunu çoğaltmak gereksizdi ve yanlışlıkla bunu yapmayı unutmak imkansızdı. –

0

Neredeyse her zaman çoklu eklemeye karşı korumak istiyorsunuz. Bunu yapmak istemediğiniz tek zaman, C makroları ile bazı güzel şeyler yapıyorsanız ve bu nedenle istediğiniz kod üretimini elde etmek için birden fazla içeriğe sahip olmayı İSTİYORSUNUZ (bunun bir örneği yok).

+0

Bana bir örnek gösterebilir misin? Teşekkürler! – sfz

12

Bir örnek, bir makro tanımlamayı bekleyen başlık dosyalarıdır.

#ifndef OTHER_H 
#define OTHER_H 

namespace other 
{ 
    enum class my_enum 
    { 
#define M(k, v) k, 
#include "m.h" 
#undef M 
    }; 

    void register_my_enum(); 
} 

#endif 

ve diğer bazı dosyasında

(muhtemelen uygulama): Hangi

#include "other.h" 

namespace other 
{ 
    template< typename E > 
    void register_enum_string(E e, const char* s) { ... } 

    void register_my_enum() 
    { 
#define M(k, v) register_enum_string(k, v); 
#include "m.h" 
#undef M 
    } 
} 
+1

FWIW, bu şeyler bazen [X makroları] olarak bilinir (https://en.wikipedia.org/wiki/X_Macro). –

İlgili konular