代码:
#if defined(FOO) && FOO(foo)
#error "FOO is defined."
#else
#error "FOO is not defined."
#endif
MSVC 19.38 打印:
<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 和 Clang 18.1 打印:
<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 打印:
<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
为什么当
FOO
未定义时,除 MSVC 之外的每个编译器都会打印有关未定义宏的错误(尽管 MSVC 也会打印警告)?有一些我在这里没有看到的特殊语义吗?
如果 FOO(foo)
评估为
defined(FOO)
,则不应评估
false
。
如果
FOO
未定义(或已定义但不是类似函数的宏),则 FOO(foo)
是语法错误。
#if
指令需要一个整型常量表达式(包括“defineidentifier”形式的表达式)。 由于 FOO(foo)
未定义,因此无法扩展,因此这不是整数常量表达式。