Question
Logical AND (&&) does not short-circuit correctly in #if
For code:
#if defined(FOO) && FOO(foo)
#error "FOO is defined."
#else
#error "FOO is not defined."
#endif
MSVC 19.38 prints:
<source>(1): warning C4067: unexpected tokens following preprocessor directive - expected a newline
<source>(4): fatal error C1189: #error: "FOO is not defined."
ICX 2024.0.0 and Clang 18.1 prints:
<source>:1:21: error: function-like macro 'FOO' is not defined
1 | #if defined(FOO) && FOO(foo)
| ^
<source>:4:6: error: "FOO is not defined."
4 | #error "FOO is not defined."
| ^
2 errors generated.
GCC 14.1 prints:
<source>:1:24: error: missing binary operator before token "("
1 | #if defined(FOO) && FOO(foo)
| ^
<source>:4:6: error: #error "FOO is not defined."
4 | #error "FOO is not defined."
| ^~~~~
Compiler returned: 1
Why does every compiler but MSVC print an error about an undefined macro when FOO
is not defined (although MSVC prints a warning too)? Is there some special semantic that I am not seeing here?
FOO(foo)
should not be evaluated if defined(FOO)
evaluates to false
.