c++ - GCC#error 不会破坏进一步的编译

标签 c++ gcc

我有几个简单的宏,它们存在于一个包含 #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/

相关文章:

c - 我是否有 gcc 优化错误或 C 代码问题?

c++ - 如何获取 std::chrono::time_point 时钟类型

c++ - C++中的虚拟析构函数

c++ - C++03 中带有 std::bind2nd 的复合函数

java - 在 Java 中使用 OpenCV 进行减法

exception - 可移植地处理 C++ 中的异常错误

gcc - ARM 交叉编译 helloworld

unix - 如何将 gcc 错误重定向到 Unix 中的文件?

c - 线程在循环中等待信号

c++ - 非 Qt 基类