2015-05-09 13 views
15

las ich die dcmtk Quellcode und fand einen Kommentar in ofstdinc.h:Welche Arten von Header-Dateien sollten nicht gegen mehrfache Aufnahme geschützt werden?

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

Und welche Arten von Header-Dateien sollten Sie nicht gegen mehrere Aufnahme geschützt werden?

+1

diejenigen, die sind versuchen, einen Hack (Mehrfacheinschluss) zu verwenden, um ein Problem zu lösen. In Ihrem eigenen neuen Code ist es das Beste, diese Art von Lösung zu vermeiden und immer mit Include-Wachen zu arbeiten. – pmg

Antwort

12

Präprozessormetaprogrammierung. Das heißt, die enthaltene Datei wird als eine Art Kompilierzeitfunktion verwendet, die eine Aufgabe ausführt. Die Argumente für die Funktion sind Makros. Sie können beispielsweise die Datei einen Abschnitt verbunden, der wie folgt aussieht:

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

Also, wenn ich "ofstack.h" umfassen wollte, ich tun würde, so wie folgt aus:

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

Nun stellen die später nach unten Linie, jemand will diesen bestimmten Abschnitt des Headers verwenden:

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

So sie wie folgt vor:

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

Wenn "ofstdinc.h" Wächter enthalten würde, wäre es nicht enthalten.

+0

In Fällen von solchen Headern, die ich gesehen habe (normalerweise verwendet, um die Körper von enums wie in der anderen Antwort einzufügen), waren die '# undefs' innerhalb der Kopfzeile selbst. Es war somit unnötig, den # undef-Code überall dort zu kopieren, wo die Kopfzeile verwendet wurde, und es ist unmöglich, dies versehentlich zu vergessen. –

0

Sie wollen fast immer vor mehrfacher Einbeziehung schützen. Das einzige, was Sie nicht wollen, ist, wenn Sie ein paar ausgefallene Sachen mit C-Makros machen und Sie daher mehrere Einschlüsse haben wollen, um die gewünschte Code-Generation zu bekommen (haben Sie kein Beispiel dafür).

+0

Können Sie mir ein Beispiel zeigen? Vielen Dank! – sfz

12

Ein Beispiel sind Header-Dateien, die erwarten, dass Sie ein Makro definieren. Betrachten sie einen Kopf m.h mit

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

Dies kann in einem anderen Header wie folgt verwendet werden:

#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 

und in einer anderen Datei (möglicherweise Implementierung):

#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, diese Dinge werden manchmal als [X-Makros] (https://en.wikipedia.org/wiki/X_Macro) bezeichnet. –

Verwandte Themen