¿Por qué se #if
cumple la condición en el siguiente código?
#include <iostream>
#define VALUE foo
int main() {
#if VALUE == bar
std::cout << "WORKS!" << std::endl;
#endif // VALUE
}
c++
c-preprocessor
michalt38
fuente
fuente
En una
#if
declaración, cualquier identificador que permanezca después de la sustitución de macro (excepto paratrue
yfalse
) se reemplaza con la constante0
. Entonces su directiva se conviertecual es verdad.
fuente
Esto se debe a que
foo
nibar
se les ha dado ninguna definición o valor, por lo que son iguales (es decir, reemplazados por un valor "0"). Los compiladores darán advertencias sobre esto.El
MSVC
compilador (Visual Studio 2019) ofrece lo siguiente:Por
VALUE
lo tanto, se le da el valor '0' (predeterminado parafoo
) ybar
también tiene '0', por lo que seVALUE == bar
evalúa como "VERDADERO".Del mismo modo,
clang-cl
da lo siguiente:fuente
MSVC
yclang-cl
, esta advertencia se puede deshabilitar (ya sea específicamente o estableciendo un 'nivel' de advertencia apropiado).Para lograr lo que busca, intente esto:
En este caso, puede desactivar las declaraciones de depuración cambiando "define" a "undef".
Es posible que su compilador le permita definir DEPURACIÓN fuera del código, en cuyo punto puede reducir el código a
Y luego invoque el compilador con una opción como -DDEBUG = 0
Consulte el capítulo sobre Programación defensiva en Steve McConnell, "Código completo".
fuente