Por que a #if
condição no seguinte código foi atendida:
#include <iostream>
#define VALUE foo
int main() {
#if VALUE == bar
std::cout << "WORKS!" << std::endl;
#endif // VALUE
}
c++
c-preprocessor
michalt38
fonte
fonte
Em uma
#if
declaração, qualquer identificador que permanece após a substituição da macro (excetotrue
efalse
) é substituído pela constante0
. Então sua diretiva se tornaque é verdade.
fonte
Isso ocorre porque nem
foo
nembar
ter sido dada qualquer definição ou valor - então eles são os mesmos (ou seja substituído por um valor "0"). Os compiladores darão avisos sobre isso.O
MSVC
compilador (Visual Studio 2019) fornece o seguinte:Assim,
VALUE
é dado o valor '0' (padrão parafoo
) ebar
também possui '0', entãoVALUE == bar
avalia como "TRUE".Da mesma forma,
clang-cl
fornece o seguinte:fonte
MSVC
eclang-cl
, esse aviso pode ser desabilitado (especificamente, ou definindo um nível de aviso apropriado).Para realizar o que você procura, tente o seguinte:
Nesse caso, você pode desativar as instruções de depuração alterando o "define" para "undef".
Você pode achar que seu compilador permite definir DEBUG fora do próprio código; nesse momento, você pode reduzir o código para
E, em seguida, chame o compilador com uma opção como -DDEBUG = 0
Confira o capítulo sobre programação defensiva em Steve McConnell, "Código completo".
fonte