【发布时间】:2020-11-28 01:50:25
【问题描述】:
根据我的经验,C 预处理器在以前预处理的源上运行时只是表现为无操作。但是这种行为是由标准保证的吗?或者一个实现可能有一个预处理器来修改以前预处理的代码,例如删除/修改行指令,或者执行其他可能混淆编译器的修改?
【问题讨论】:
-
你是如何调用预处理器的,准确地说?它通常是编译器的一部分,您不能手动运行它。此外,通过 C 预处理器的文件不会覆盖自身。
-
我的意思是多次调用预处理器。例如
cpp src.c > prepro.c然后cpp prepro.c > prepro2.c -
预处理器仅修改其输出(相对于其输入)以响应预处理器指令;编译器(接收预处理器的输出)将不知道如何处理任何预处理器指令,因此推测预处理器的输出中永远不会有任何预处理器指令(如果我们期望编译器能够使用代码)。因此,我认为可以有效地保证通过预处理器运行已经预处理的代码将是无操作的,即使 C 标准中没有这样说明。
-
您在上面评论中的示例只会生成相同文件的两个副本。它相当于
copy test.txt test1.txt copy test.txt test2.txt的命令行。两个文件内容的二进制比较将与您的示例中的两个文件完全相同。 -
一些 clang 开发者似乎认为应该允许这样做来消除一些警告或生成新警告:bugs.llvm.org/show_bug.cgi?id=39367#c1
标签: c c-preprocessor