使用定义的运算符时,双嵌套括号会在宏内部引发错误

Double nested parentheses throw an error inside macro when using the defined operator

我正在写一个模拟器,我希望它和 C 中的宏完全一样。下面的代码让我很困惑:


这是有效代码 returns true:

#if ((((1 + ((2)))))) == 3

这也是有效代码 returns 正确:

#define hi hello
#if defined (hi)

但这会抛出一个错误并且无法编译:

#define hi hello
#if defined ((hi))

这不起作用有什么特殊原因吗? 它似乎应该工作。


这里是link如果你想在线测试宏:https://godbolt.org/(把-E作为参数)
这里有一个 link 来解释定义的运算符:https://gcc.gnu.org/onlinedocs/gcc-8.4.0/cpp/Defined.html

#if 进行数学 评估。你的括号被评估为 C 表达式。越多越好,他们不会更改表达式计算的值 (当然,当他们这样做时,设置为更改运算符优先级时除外)。

#ifdef identifier / #if defined identifier / #if defined( identifier )(括号对于 defined 运算符是可选的,对于 #ifdef 不允许)检查给定的是否标识符 已定义。标识符以字母或下划线开头,只能包含字母、下划线或数字。

hi是一个标识符。

(hi) 不是。

C 2018 6.10.1 在 #if#elif 指令中指定 define 的行为。它说控制条件包含的表达式:

… may contain unary operator expressions of the form

defined identifier

or

defined ( identifier )

which evaluate to 1 if the identifier is currently defined as a macro name…

因此,defined的操作数不是一般的C表达式,而只是标识符”或“( 标识符 )”.