C
预处理器如何处理多个宏?我也在这里和Google上进行了搜索,但无法理解应遵循的确切规则。如下代码:
#define ABC xYz
#define xYz ABC
int main()
{
int ABC;
int xYz;
}
在gcc上,生成preprocessor.i像这样:
# 1 "preprocessor.c"
# 1 "<command-line>"
# 1 "preprocessor.c"
int main()
{
int ABC;
int xYz;
}
似乎这里什么也没有取代。和其他代码:
#define ABC kkk
#define xYz ABC
int main()
{
int ABC;
int xYz;
}
生成这样的输出:
# 1 "preprocessor.c"
# 1 "<command-line>"
# 1 "preprocessor.c"
int main()
{
int kkk;
int kkk;
}
那么所有这些都是如何发生的。
第一种情况下的行为是正确的,因为一旦在扩展中使用了宏一次,就无法再使用它。因此,预处理器首先将ABC
inint ABC;
转换为int xYz;
,然后将其xYz
转换为ABC
,但是由于两个宏都已使用一次,因此无法进行进一步的转换。
当然,第二个代码的行为也正确。该int ABC;
直接变成int kkk;
。将int xYz;
变成int ABC;
再进int kkk;
。
您可以看一下C预处理程序进行多少遍?有关更多信息。
预处理程序是一个接一个地进行宏替换吗,就像首先
#define ABC xYz
完成对应的扩展然后转到#define xYz ABC
,还是一次性处理两个宏?如果是第一种情况,则输出应为int ABC
和int ABC
。
定义宏的顺序并不重要。预处理器对输入进行标记化,并针对每个符号查看是否定义了宏。如果有宏,它将应用宏扩展,然后将其标记为“已使用”(对于当前令牌扩展)。然后,它将重新扫描替换文本,再次查找令牌,然后再次应用宏(除非将其标记为“已使用”)。“使用标记”可防止宏扩展中的无限递归。完成重新扫描替换文本的操作后,所有“已使用”宏都再次标记为“未使用”。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句