【发布时间】:2015-11-15 19:39:02
【问题描述】:
1. #define NUM 10
2. #define FOO NUM
3. #undef NUM
4. #define NUM 20
5.
6. FOO
当我只运行预处理器时,输出文件包含 20 个。
但是,据我了解,预处理器只是进行文本替换。所以这就是我认为正在发生的事情(这显然是错误的,但很愚蠢):
- NUM 定义为 10。
- 因此,在第 2 行中,NUM 被替换为 10。所以现在我们有了“#define FOO 10”。
- NUM 未定义。
- NUM 被重新定义,现在是 20。
- FOO 根据第 2 行替换,在第 4 行重新定义之前,为 10。
所以我认为输出应该是 10 而不是 20。有什么可以解释哪里出错了吗?
【问题讨论】:
-
这是 C 还是 C++ 问题?这两种语言不同,请选择一种。
-
预处理器的精确行为在标准中,无需猜测。
-
@AlanStokes:您是否尝试过从标准中解决这个问题?我是一名语言律师,但 10 分钟后我还无法证明我的行为。
-
@LightnessRacesinOrbit 这是一个公平的观点。我确实理解过一次。
-
FOO永远不会被定义为NUM以外的任何东西。文本替换法则表明NUM将是遇到NUM时定义的任何内容。line 6NUM定义为20。
标签: macros c-preprocessor