我似乎记得可以通过将宏名称放在括号中来抑制C中宏的替换(扩展),例如(free)(p),free无论是否free定义了宏,都会调用该函数.我在C99标准中没有提到这一点(它就在那里,见答案),我观察到了这一点MSVS 2013也没有实现它.根据答案添加:它确实如同标准所要求的那样,即仅用于类似函数的宏,其扩展由后续' (' 触发并因此被干预' )' 抑制.
我是在做梦,还是有这样的可能性?如果有的话,撤回它的理由是什么?或只出现在某些方言?
一个类似函数的宏 FOO
#define FOO(x) ...
Run Code Online (Sandbox Code Playgroud)
仅在令牌FOO出现后跟(令牌时展开.因此,为防止膨胀FOO,(FOO)可以使用.就像你说的那样.然而,这仅适用于类似函数的宏.
这在ISO 9899:2011§6.10.310中规定,其内容如下:
10表单的预处理指令
#define identifier lparen identifier-list opt ) replacement-list new-line
#define identifier lparen ...) replacement-list new-line
#define identifier lparen identifier-list ,...) replacement-list new-line定义了一个带有参数的类函数宏,它的用法在语法上与函数调用类似.参数由可选的标识符列表指定,其范围从它们在标识符列表中的声明扩展到终止#define预处理指令的换行符.类似函数的宏名称的每个后续实例后跟一个(作为下一个预处理标记引入了预处理标记序列,该标记由定义中的替换列表替换(宏的调用).预处理标记的替换序列是由匹配终止)预处理记号,跳过中间匹配对左和右括号预处理标记的.在构成类函数宏调用的预处理令牌序列中,换行被认为是正常的空白字符.
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |