我似乎回想起来,可以通过将宏名称放在括号中来抑制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调用宏).替换的预处理序列令牌由匹配终止)预处理令牌,跳过左右括号预处理的干预匹配对令牌.在预处理令牌的序列中调用一个类似功能的宏,新行被认为是正常的空白字符.