根据我的经验,C 预处理器在之前预处理过的源代码上运行时只是表现为无操作。但是这种行为是由标准保证的吗?或者,一个实现可能有一个预处理器来修改以前预处理过的代码,例如删除/修改行指令,或者执行其他可能会混淆编译器的修改?
通常,cpp不能保证预处理 via是幂等的(第一次运行后的 noop)。一个简单的反例:
#define X #define Y z
X
Y
Run Code Online (Sandbox Code Playgroud)
第一次调用将产生:
#define Y z
Y
Run Code Online (Sandbox Code Playgroud)
第二个:
z
Run Code Online (Sandbox Code Playgroud)
话虽如此,有效的 C 代码不应该做这样的事情(因为输出不是编译器下一阶段的有效输入)。
此外,根据您尝试执行的操作,cpp类似的选项-fpreprocessed可能会有所帮助。