最近我遇到了以下问题。我的实现看起来像这样:
#define MY_CODE_VERSION PROJ_VERSION
#include "project.h"
if (3 != MY_CODE_VERSION)
PROJ_VERSION在project.h中定义。为什么我没有收到警告/错误?因为我正在尝试在宏上定义某些东西,而编译器到达#define MY_CODE_VERSION PROJ_VERSION
行时还不知道。
我查看了ANSI C的这些阶段,但无法弄清原因(编译器的实际行为,在此阶段MY_CODE_VERSION取PROJ_VERSION的值)。
我的假设是,此替换仅发生在“ #if(3!= MY_CODE_VERSION)”行,此时,编译器已经可以从上面的project.h中知道PROJ_VERSION。
提前谢谢
答案 0 :(得分:2)
我不会散列您已经知道的内容。您显然不知道的内容:
简而言之,一旦扩展了宏并执行了所有的字符串化程序和串联操作,就会再次扫描所得的“内容”,以替换更多的内容。如果找到相同的名称,则不被替换。6.10.3.4 重新扫描并进一步替换
- 替换列表中的所有参数并进行#和##处理后,所有地标预处理 令牌已删除。然后,产生的预处理令牌序列 重新扫描,以及所有后续的 源文件,以替换更多的宏名称。
- 如果在扫描替换列表期间找到了要替换的宏的名称(不包括源文件的其余部分) 预处理令牌),则不会替换它。此外,如果有嵌套 替换遇到要替换的宏的名称,不是 更换。这些不可替换的宏名称预处理令牌不是 更长的时间可用于进一步更换,即使稍后再使用 (重新)在该宏名称预处理令牌的上下文中进行了检查 否则将被替换。
- 所得的完全替换宏的预处理令牌序列不会作为预处理指令处理,即使它 类似于一个,但其中的所有杂用一元运算符表达式都是 然后按照以下6.10.9的规定进行处理。
所以您看到的是标准定义的。