Warum ist die #if
Bedingung im folgenden Code erfüllt:
#include <iostream>
#define VALUE foo
int main() {
#if VALUE == bar
std::cout << "WORKS!" << std::endl;
#endif // VALUE
}
c++
c-preprocessor
michalt38
quelle
quelle
In einer
#if
Anweisung wird jeder nach der Makrosubstitution verbleibende Bezeichner (mit Ausnahme vontrue
undfalse
) durch die Konstante ersetzt0
. So wird Ihre Direktivewas wahr ist.
quelle
Dies liegt daran , weder
foo
nochbar
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:Erhält
VALUE
also den Wert '0' (Standard fürfoo
) undbar
hat auch '0', ergibt alsoVALUE == bar
"TRUE".In ähnlicher Weise
clang-cl
ergibt sich Folgendes:quelle
MSVC
undclang-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:
In diesem Fall können Sie die Debugging-Anweisungen deaktivieren, indem Sie "define" in "undef" ändern.
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
Rufen Sie dann den Compiler mit einer Option wie -DDEBUG = 0 auf
Lesen Sie das Kapitel über defensive Programmierung in Steve McConnell, "Code Complete".
quelle