C翻译阶段4

时间:2018-08-08 05:11:26

标签: c c-preprocessor

最近我遇到了以下问题。我的实现看起来像这样:

#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。

提前谢谢

1 个答案:

答案 0 :(得分:2)

我不会散列您已经知道的内容。您显然知道的内容:

  

6.10.3.4 重新扫描并进一步替换

     
      
  1. 替换列表中的所有参数并进行#和##处理后,所有地标预处理   令牌已删除。然后,产生的预处理令牌序列   重新扫描,以及所有后续的   源文件,以替换更多的宏名称。
  2.   
  3. 如果在扫描替换列表期间找到了要替换的宏的名称(不包括源文件的其余部分)   预处理令牌),则不会替换它。此外,如果有嵌套   替换遇到要替换的宏的名称,不是   更换。这些不可替换的宏名称预处理令牌不是   更长的时间可用于进一步更换,即使稍后再使用   (重新)在该宏名称预处理令牌的上下文中进行了检查   否则将被替换。
  4.   
  5. 所得的完全替换宏的预处理令牌序列不会作为预处理指令处理,即使它   类似于一个,但其中的所有杂用一元运算符表达式都是   然后按照以下6.10.9的规定进行处理。
  6.   
简而言之,一旦扩展了宏并执行了所有的字符串化程序和串联操作,就会再次扫描所得的“内容”,以替换更多的内容。如果找到相同的名称,则被替换。

所以您看到的是标准定义的。