Antworten:
Auf der Seite auf cppreference.com heißt es:
Nach allen Makroerweiterungen und Auswertungen definierter und __has_include (seit C ++ 17) Ausdrücke wird jeder Bezeichner, der kein boolesches Literal ist, durch die Zahl 0 ersetzt (dies schließt Bezeichner ein, die lexikalisch Schlüsselwörter sind, aber keine alternativen Token wie und ).
Also beide foo
und bar
werden durch 0 ersetzt.
In einer #if
Anweisung wird jeder nach der Makrosubstitution verbleibende Bezeichner (mit Ausnahme von true
und false
) durch die Konstante ersetzt 0
. So wird Ihre Direktive
#if 0 == 0
was wahr ist.
Dies liegt daran , weder foo
noch bar
eine Definition oder Wert angegeben wurde - so sie gleich sind (dh mit einem Wert „0“ ersetzt). Compiler geben hierzu Warnungen aus.
Der MSVC
Compiler (Visual Studio 2019) bietet Folgendes:
Warnung C4668: 'foo' ist nicht als Präprozessor-Makro definiert und wird durch '0' für '# if / # elif' ersetzt.
Warnung C4668: 'bar' ist nicht als Präprozessor-Makro definiert und wird durch '0' für '#if' ersetzt / # elif '
Erhält VALUE
also den Wert '0' (Standard für foo
) und bar
hat auch '0', ergibt also VALUE == bar
"TRUE".
In ähnlicher Weise clang-cl
ergibt sich Folgendes:
Warnung: 'foo' ist nicht definiert, ergibt 0 [-Wundef]
Warnung: 'bar' ist nicht definiert, ergibt 0 [-Wundef]
MSVC
und clang-cl
Compiler kann diese Warnung deaktiviert werden (entweder ausdrücklich oder durch eine entsprechende Warnung ‚Ebene‘ gesetzt wird ).
Versuchen Sie Folgendes, um das zu erreichen, wonach Sie suchen:
#include <iostream>
#define DEBUG
int main() {
#ifdef DEBUG
std::cout << "WORKS!" << std::endl;
#endif
}
In diesem Fall können Sie die Debugging-Anweisungen deaktivieren, indem Sie "define" in "undef" ändern.
#include <iostream>
#undef DEBUG
int main() {
#ifdef DEBUG
std::cout << "WORKS!" << std::endl;
#endif
}
Möglicherweise können Sie mit Ihrem Compiler DEBUG außerhalb des Codes selbst definieren. An diesem Punkt können Sie den Code auf reduzieren
#include <iostream>
int main() {
#ifdef DEBUG
std::cout << "WORKS!" << std::endl;
#endif
}
Rufen Sie dann den Compiler mit einer Option wie -DDEBUG = 0 auf
Lesen Sie das Kapitel über defensive Programmierung in Steve McConnell, "Code Complete".