2014-09-02 48 views
1

我有几个简单的宏存在于一个大项目中的一些文件,其中包括一个#error。他们都遵循这种结构中,或多或少:GCC#错误,不会打破进一步编译

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

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

+2

我想你;重新寻找'make -k'或等价物,而不是编译器本身的任何特性。 – zwol 2014-09-02 21:51:15

回答

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编译的任何其他文件而言,与编译或预处理文件的其余部分完全无关,它与任何编译指示或指令的作用完全无关。一旦由make执行的命令以非零退出代码终止,则停止执行更多命令。要改变这种情况,请使用-k选项,因为它已被提及。

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

+0

这取决于编译器;在第一个'#error'中停止编译的权限是完全合适的(作为一个程序,这实际上是我希望看到的;如果#错误已经被触发,那是因为一些严重的问题,即渲染该文件的其余部分无效)。 – 2014-09-02 22:19:59

+0

当然,但问题是明确提到gcc。 – 2014-09-02 22:25:58

+0

我知道#error允许当前文件的预处理完成,这是我想要的行为。持续预处理的重点是打印整个项目中存在的所有TODO消息。上面的宏只是一个愚蠢的版本。 – user2559503 2014-09-02 22:37:55