0

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

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

任何关于 C 中语法提示/技巧的参考也将不胜感激!

4

1 回答 1

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) 的这一部分处理宏名称未扩展的情况:

类似函数的宏名称的每个后续实例后跟(作为下一个预处理标记的 a 引入了预处理标记的序列,该序列被定义中的替换列表替换(宏的调用)。

注意 '后跟一个 ( ' 位。这意味着(因为标准没有另外指定)在没有 ' ( ' 的情况下,宏不会被扩展并被解释为 C 标记。

“破译” C 标准的某些神秘方面的一个很好的资源是新的 C 标准:经济和文化评论,可在http://www.knosof.co.uk/cbook/cbook.html获得。一个公平的警告:这是一本很长的书,但如果一个人进入了 C 的奥秘,那么它非常值得一读。虽然它不处理宏。更轻松的读物是C:参考手册(查看http://careferencemanual.com/),其中一章介绍了 C 预处理器的精妙之处。

于 2013-09-16T17:09:56.227 回答