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

我似乎回想起来,可以通过将宏名称放在括号中来抑制C中的宏替换(扩展). (free)(p)将自动调用函数,无论是否定义了宏自由.我在C99标准中没有提到这一点(它在那里,见答案),我观察到MSVS 2013也没有实现.根据答案补充说:它符合标准要求,即只适用于类似功能的宏,其扩展由以下'(‘所触发,因此被介入’)被触发.

我在做梦,还是有这样的可能性,如果是这样,撤回的理由是什么?还是只在某些方言出现?

解决方法

一个类似功能的宏FOO
#define FOO(x) ...

只有当令牌FOO出现时,才会扩展,然后是(令牌),因此,为了防止扩展FOO,可以使用(FOO).正如你所说,这只适用于类似功能的宏.

这在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

使用参数定义了一个类似函数的宏类似于函数调用.指定了参数通过可选的标识符列表,其范围从它们的范围扩展在标识符列表中声明直到新行字符为止终止#define预处理指令.每个后续函数式宏名称的实例后跟一个(作为下一个)预处理令牌介绍了预处理令牌的顺序这被定义中的替换列表(an调用宏).替换的预处理序列令牌由匹配终止)预处理令牌,跳过左右括号预处理的干预匹配对令牌.在预处理令牌的序列中调用一个类似功能的宏,新行被认为是正常的空白字符.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...