C99(或C11)标准如何用于解释这种宏观扩张的情况?

时间:2013-09-16 16:43:07

标签: c c99

特别是,我正在尝试找到这个问题的接受答案的参考文档:Macro and function with same name

任何人都可以指出在函数声明中使用括号的任何好的引用,如上述示例所示?

对C语法提示/技巧的任何引用也会受到赞赏!

1 个答案:

答案 0 :(得分:3)

您在评论中引用了正确的文档(C99标准,http://open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf,较新的C11标准未对这些部分进行任何重大更改)。处理宏替换的部分是6.10.3和6.10.3.4。特别是,无法使无限替换循环的机制(这是您提到的链接中描述的机制的核心)可以在6.10.3.4(2)中找到:

  

如果在替换列表的扫描期间找到要替换的宏的名称   (不包括源文件的其余预处理标记),它不会被替换。    此外,如果任何嵌套替换遇到要替换的宏的名称,   它没有被替换。这些未替换的宏名称预处理标记不再存在   可用于进一步更换,即使它们稍后(重新)检查在其中   否则宏名称预处理令牌将被替换。

6.10.3(10)的这一部分处理未扩展宏名称的实例:

  

每个后续实例   函数式宏名称后跟(作为下一个预处理标记引入   由定义中的替换列表替换的预处理标记序列   (调用宏).`

注意'后跟一个('位。这意味着(因为标准没有另外说明),在没有''宏的情况下)未展开并被解释为C令牌。

“解密”C标准的一些神秘方面的重要资源是新C标准:经济和文化评论,可在http://www.knosof.co.uk/cbook/cbook.html获得。一个公平的警告:这是一本的书,但如果有人进入C的奥秘,那么值得一读。但它并不涉及宏。较轻的读数是 C:A参考手册(查看http://careferencemanual.com/),其中 有一章关于C预处理器的细微之处。