Почему выполняется #if
условие в следующем коде:
#include <iostream>
#define VALUE foo
int main() {
#if VALUE == bar
std::cout << "WORKS!" << std::endl;
#endif // VALUE
}
c++
c-preprocessor
michalt38
источник
источник
В
#if
операторе любой идентификатор, который остается после подстановки макроса (кромеtrue
иfalse
), заменяется константой0
. Таким образом, ваша директива становитсячто является правдой.
источник
Это связано с тем, что ни то,
foo
ни другое неbar
было дано ни определения, ни значения - поэтому они одинаковы (т.е. заменены значением «0»). Компиляторы будут предупреждать об этом.MSVC
Компилятор (Visual Studio 2019) дает следующее:Так
VALUE
дается значение «0» (по умолчанию дляfoo
), аbar
также имеет «0», такVALUE == bar
оценивается как «ИСТИНА».Аналогично,
clang-cl
дает следующее:источник
MSVC
иclang-cl
компиляторы, это предупреждение может быть отключено (либо специально, либо установив соответствующее предупреждение «уровень»).Чтобы выполнить то, что вы хотите, попробуйте это:
В этом случае вы можете отключить операторы отладки, изменив «define» на «undef».
Вы можете обнаружить, что ваш компилятор позволяет вам определять DEBUG вне самого кода, после чего вы можете уменьшить код до
А затем вызовите компилятор с параметром, например -DDEBUG = 0
Прочтите главу «Защитное программирование» Стива Макконнелла «Код завершен».
источник