【问题标题】:How many passes does the C preprocessor make?C 预处理器进行了多少次传递?
【发布时间】:2012-11-18 16:27:39
【问题描述】:

C 预处理器对代码进行了多少次传递?

我在 gcc 4.7.2 上测试了以下代码

#define a 5
#define b a
#define c b
#define d c
#define e d
#define f e
#define g f
#define h g
#define j h
#define k j
#define l k
#define m l

int main(void) {return d;}

没有错误:

$ gcc -E 1.c
# 1 "1.c"
# 1 "<command-line>"
# 1 "1.c"
# 14 "1.c"
int main(void) {return 5;}

这是标准行为吗?

【问题讨论】:

  • 为什么出现错误?

标签: c c-preprocessor


【解决方案1】:

C 预处理器继续运行,直到没有更多可扩展的内容为止。这不是通行证的问题。这是完整性的问题。

它确实避免了宏的递归扩展。宏一旦展开一次,就不会在替换文本中重新展开。


标准关于宏扩展限制的唯一说明是在 §5.2.4.1 翻译限制中,它说:

实现应该能够翻译和执行至少一个程序 包含以下每一项限制的至少一个实例:18)

...

  • 4095 个宏标识符同时定义在一个预处理翻译单元中

18) 实施应尽可能避免施加固定的翻译限制。

因此,预处理器必须能够处理至少 4095 个宏,并且如果除了其中一个宏之外的所有宏都按顺序扩展为另一个宏(如您的示例中所示),则结果必须是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    相关资源
    最近更新 更多