我有几个简单的宏,它们存在于一个包含 #error
的大型项目的某些文件中。它们或多或少都遵循这种结构:
#ifdef COMPFAIL
#pragma message "Compilation Has Failed"
#error
#endif
我想设置项目,这样,如果定义了 COMPFAIL
,则每个文件中的 #pragma
都会出现编译最终失败的情况。我现在明白,当 #error
被调用时,它会当场停止编译,不会尝试编译我的 Makefile 中定义的任何其他文件并阻止所有进一步的 #pragma
调用发生。有没有办法强制编译器在失败之前完成对所有文件的预处理?
最佳答案
一个非常简单的测试:
#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
是否中止手头的立即编译没有直接关系。无论哪种方式,编译都会以非零退出代码停止,这就是这里的驱动因素。
关于c++ - GCC#error 不会破坏进一步的编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25632957/