GCC #error不会打破进一步的编译

时间:2014-09-02 21:50:18

标签: c++ gcc

我在包含#error的大型项目的某些文件中存在几个简单的宏。它们或多或少都遵循这种结构:

#ifdef COMPFAIL
#pragma message "Compilation Has Failed"
#error
#endif

我想设置项目,以便在定义COMPFAIL时,每个文件中的#pragma都会出现,编译最终会失败。我现在明白,当调用#error时,它会暂时停止编译,而不是尝试编译我的Makefile中定义的任何其他文件,并阻止所有进一步的#pragma调用发生。有没有办法强制编译器在失败之前完成所有文件的预处理?

1 个答案:

答案 0 :(得分:2)

一个非常简单的测试:

#error foo
#error bar

使用gcc编译此文件会产生以下结果:

t.c:2:2: error: #error foo
#error foo

t.c:3:2: error: #error bar
#error bar

很明显,#error并没有完全停止编译文件。如果是,只报告第一个错误,编译就会停止。但是,在#error之后,编译器继续运行,并继续预处理和编译其余代码。但是,这是毫无意义的,因为一旦发生错误,编译器将不会生成目标文件,因此我不清楚您希望从继续预处理此文件中获得什么好处。

现在,对于通过makefile编译的任何其他文件,这与任何pragma或指令完全无关,只要编译或预处理文件的其余部分即可。一旦make执行的命令以非零退出代码终止,make就会停止执行更多命令。要更改它,请使用-k选项,因为它已被提及。

请注意,-k选项与#error是否中止立即编译没有直接关系。无论哪种方式,编译都以非零退出代码停止,这就是驱动因素,这里。