使用定义的运算符时,双嵌套括号会在宏内部引发错误
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表达式,而只是“标识符”或“(
标识符 )
”.
我正在写一个模拟器,我希望它和 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
identifieror
defined
(
identifier)
which evaluate to 1 if the identifier is currently defined as a macro name…
因此,defined
的操作数不是一般的C表达式,而只是“标识符”或“(
标识符 )
”.