【发布时间】:2020-10-22 02:26:46
【问题描述】:
假设我有以下两个宏定义:
#define foo(X) 1 bar
#define bar(X) 2 foo
为什么foo(X)(Y)(Z) 会扩展为1 2 1 bar?
根据 C99 标准 6.10.3.4 重新扫描和进一步替换
如果在此扫描期间找到要替换的宏的名称 替换列表(不包括源文件的其余部分 预处理令牌),它不会被替换。此外,如果任何嵌套 替换遇到被替换的宏的名称,它不是 更换。这些不可替换的宏名称预处理标记不是 更长的时间可用于进一步更换,即使它们稍后再更换 在该宏名称预处理标记的上下文中(重新)检查 否则会被替换。
所以这些标记的翻译方式似乎是以下序列
foo(X)(Y)(Z)
1 bar(Y)(Z)
1 2 foo(Z)
1 2 1 bar
显然foo 的第二个宏调用没有被涂成蓝色。我有点不确定为什么会这样。它不是由调用bar 引起的替换的一部分吗?这将使它成为第一次调用foo 的替换的嵌套替换。
我只能争辩说,这些扩展的工作方式是导致foo 和bar 的宏调用的标记部分位于嵌套替换中,即宏的名称在其中,部分在外部替换,即括号部分在替换之外。
也许我完全误解了嵌套替换的含义。
谁能帮我解释一下。
【问题讨论】:
标签: c c-preprocessor c99