我在包含#error
的大型项目的某些文件中存在几个简单的宏。它们或多或少都遵循这种结构:
#ifdef COMPFAIL
#pragma message "Compilation Has Failed"
#error
#endif
我想设置项目,以便在定义COMPFAIL
时,每个文件中的#pragma
都会出现,编译最终会失败。我现在明白,当调用#error
时,它会暂时停止编译,而不是尝试编译我的Makefile中定义的任何其他文件,并阻止所有进一步的#pragma
调用发生。有没有办法强制编译器在失败之前完成所有文件的预处理?
答案 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
是否中止立即编译没有直接关系。无论哪种方式,编译都以非零退出代码停止,这就是驱动因素,这里。