根据我的经验,C预处理程序在先前预处理的源代码上运行时只是无操作。但是这种行为是否可以通过标准得到保证?也许某个实现可以具有一个预处理器,该预处理器可以修改先前经过预处理的代码,例如,删除/修改行指令,或者执行可能会使编译器感到困惑的其他修改?
通常,cpp
不能保证过孔的预处理是幂等的(第一次运行后会出现Noop)。一个简单的反例:
#define X #define Y z
X
Y
第一次调用将产生:
#define Y z
Y
第二个:
z
话虽如此,有效的C代码不应该这样做(因为输出对于编译器的下一阶段不是有效的输入)。
此外,根据你要尝试执行的操作,可能会有cpp
类似的选择-fpreprocessed
。
Cop不是ac编译器。
@P__JsupportswomeninPoland OP评论他/她正在使用
cpp
。我认为您的意思是不能保证它是幂等的。当然,也不保证它是无操作的,因为期望预处理器实际上会做一些事情(除非源没有预处理器指令或必需的宏)。但这并不奇怪
@rici是个恰当的词,是的。我试图使用OP自己的话。谢谢!
我认为还有更多“实用”的答案不能解决问题。一个明显的问题是预定义的宏。您需要能够完全关闭它们,以便将预处理的源反馈回来,否则它们在预处理器输出中的任何实例都将得到双扩展。我记得看到/制作了更好的例子,但现在想不起来。