特别是,我正在尝试找到这个问题的接受答案的参考文档:Macro and function with same name
任何人都可以指出在函数声明中使用括号的任何好的引用,如上述示例所示?
对C语法提示/技巧的任何引用也会受到赞赏!
答案 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预处理器的细微之处。