&& 在 #if

问题描述 投票:0回答:1

代码:

#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

c gcc visual-c++ clang c-preprocessor
1个回答
1
投票

如果

FOO
未定义(或已定义但不是类似函数的宏),则
FOO(foo)
是语法错误。

#if
指令需要一个整型常量表达式(包括“defineidentifier”形式的表达式)。 由于
FOO(foo)
未定义,因此无法扩展,因此这不是整数常量表达式。
    

© www.soinside.com 2019 - 2024. All rights reserved.