Ok, Hauptsache mal zu Wort gemeldet.
Die Sache ist, dass der Präprozessor nicht definierte Symbole zu 0
auswertet aber keinen Fehler erzeugt. Das ist historisch so. Das
bedeutet bei
1 | #if TEST != 0
|
2 | // tue A
|
3 | #else
|
4 | // tue B
|
5 | #endif
|
kann sich der Entwickler nicht sicher sein, ob B eincompiliert wird,
weil TEST definiert und auf 0 gesetzt wurde, oder weil TEST gar nicht
definiert ist. Das macht bei großen Projekten Probleme, wenn irgendwo
ein #include vergessen wurde. Dann kann es passieren, dass verschiedene
Modulen mit inkonsistenter Konfiguration compiliert werden. Will man
nicht.
Wenn man statt dessen also einen Fehler möchte, kann man das so machen:
1 | #if 1/defined(TEST) && (TEST != 0)
|
2 | // tue A
|
3 | #else
|
4 | // tue B
|
5 | #endif
|
Der Fehler entsteht, falls TEST nicht definiert ist, da der Präprozessor
bei der Division durch 0 abbricht (1/0). Ist TEST definiert, steht dort
(1/1) und somit
Für das erfolgreiche compilieren muss TEST dann definiert sein und A
wird eincompiliert falls TEST != 0 und andernfalls wird B eincompiliert
falls TEST == 0. So wie man es erwarten würde - nur mit Fehler beim
compilieren, falls TEST nicht definiert ist.