Also, um das nochmal ganz klar zu sagen:
Präprozessor-Befehle haben
nichts damit zu tun, einen Singleton zu implementieren.
Mit Präprozessor-Befehlen wie #ifndef oder #ifdef kann man steuern, welchen Quelltext der Compiler letztendlich zu sehen bekommt, so wie das oben schon beschrieben ist. Das ist quasi wie ein "if" das schon beim Compilieren ausgewertet wird.
Was Devil meinte war vom Sinn her etwas anderes. Nehmen wir doch mal die MessageBox Methode als Beispiel, die (sinngemäß) folgendermaßen definiert ist:
|
C-/C++-Quelltext
|
1
2
3
4
5
|
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif
|
Wenn also UNICODE definiert ist (das wird gewöhnlich beim Erzeugen eines Projekts in VC++ festgelegt) soll MessageBoxW (für Wide-Character) benutzt werden, andernfalls MessageBoxA (für ASCII-Character). Das kann man sich vorstellen, als würde der Variable MessageBox der Wert MessageBox[WA] zugewiesen.
Wenn du jetzt irgendwo im Quelltext MessageBox benutzt, wird das vom Präprozessor ersetzt, bevor der Compiler den endgültigen Quelltext sieht. Das ist so, weil wir das für den Präprozessor mit #define so festgelegt haben.
#include ist auch ein Präprozessor Befehl, der nichts anders macht, als den Inhalt der angegebenen Datei an der Stelle einzufügen, wo das #include steht, und diesen dann so zu behandeln, als hätte er dort schon vorher gestanden.
Fazit: Wenn man etwas compiliert, wird der Quelltext erst durch einen Präprozessor aufbereitet, so dass ein "neuer" Quelltext entsteht, der dann erst durch den eigentlichen Compiler läuft.
Gruss,
Rainer