可以(或可以)通过将名称括在括号中来抑制 C 中的宏替换

Can (or could) one suppress macro replacement in C by enclosing the name in brackets

我似乎记得有人可以通过将宏名称放在方括号中来抑制 C 中宏的替换(扩展),例如(free)(p) 将调用函数 free,无论是否定义了宏 free。我在 C99 标准中没有看到这一点(它在那里,见答案),我观察到 MSVS 2013 也没有实现它 . 根据答案添加:确实如此,正如标准要求的那样,即仅适用于 类函数 宏,其扩展 由以下触发'(',因此被中间的')'抑制。

我是在做梦,还是有这样的可能性,如果是,撤回它的理由是什么?或者只存在于某些方言中?

一个function-like宏FOO

#define FOO(x) ...

仅当标记 FOO 出现后跟 ( 标记时才展开。因此,为了防止 FOO 的扩展,可以使用 (FOO)。正如你所说。然而,这仅适用于 function-like 宏。

这是在 ISO 9899:2011 §6.10.3 ¶10 中指定的,内容为:

10 A preprocessing directive of the form

# define identifier lparen identifier-listopt ) replacement-list new-line
# define identifier lparen ... ) replacement-list new-line
# define identifier lparen identifier-list , ... ) replacement-list new-line

定义了一个带参数的function-like宏,其用途是 语法上类似于函数调用。指定参数 通过可选的标识符列表,其范围从它们的 标识符列表中的声明,直到 new-line 字符 终止 #define 预处理指令。随后的每个 function-like 宏名称的实例后跟 ( 作为下一个 preprocessing token 介绍预处理token的顺序 被定义中的替换列表替换(一个 调用宏)。替换后的预处理序列 tokens 由匹配的 ) 预处理令牌终止,跳过 插入匹配的左右括号预处理 令牌。在构成一个预处理标记的序列中 调用 function-like 宏,new-line 被认为是正常的 white-space个字符。