Ich verwend sowohl Include-Guards als auch
#pragma once, da ich es gerne so halte, dass mein Code soweit als möglich unabhängig von optionalen Compilerfeatures korrekt ist (ein standardkonformer C++ Compiler
darf ein
#pragma once einfach so ignorieren):
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
|
#ifndef INCLUDED_MY_HEADER
#define INCLUDED_MY_HEADER
#pragma once
// ...
#endif // INCLUDED_MY_HEADER
|
Damit hast du das Beste aus beiden Welten: Der Code ist nicht abhängig davon, dass der Compiler
#pragma once supported, wenn dieser das aber tut, kommst du in den Genuss der entsprechenden Vorteile (selbst der Fall, dass der Compiler Include-Guard-Detection macht, aber
#pragma once nicht kennt, sollte bei dieser Variante abgedeckt sein). Include-Guards bekommen bei mir das
INCLUDED_ Präfix. Das minimiert nicht nur das Potential zu Namenskonflikten und beugt damit Problemen wie im obigen Beispiel mit
VEKTOR vor, sondern vermeidet insbesondere auch, dass IntelliSense mich ständig mit uninteressanten Makronamen zuspammen muss...
Was Namensschemen für Include-Guards betrifft, sollte man an dieser Stelle evtl. erwähnen, dass man recht oft Dinge wie z.B.
__MY_HEADER_H__ sieht. Leider ist es offenbar sogar so, dass einige, recht populäre C++ IDEs standardmäßig Include-Guards dieser Form automatisch generieren (man kann wohl hoffen, dass dies in den meisten solchen IDEs mittlerweile gefixed wurde). Das Problem dabei ist, dass sowohl Namen, die mit einem Underscore gefolgt von einem Großbuchstaben beginnen, als auch Namen, die einen doppelten Underscore enthalten, reservierte Namen sind und in einem standardkonformen C++ Programm eigentlich nicht verwendet werden dürfen.