在其他地方(例如,here在SO上)甚至我自己的内存告诉我#error
将导致编译终止,但是如果我编译它:
#ifndef FOO
# error "FOO not defined."
#endif
int main() {
return "exit now!!";
}
我明白了:
g++ -Wall -o /dev/null main.cpp
main.cpp:2:4: error: #error "FOO not defined."
# error "FOO not defined."
^~~~~
main.cpp: In function 'int main()':
main.cpp:8:10: error: invalid conversion from 'const char*' to 'int' [-fpermissive]
return "exit!!";
^~~~~~~~
这适用于g ++版本5.4.0(Ubuntu 5.4.0-6ubuntu1~16.04.4 20160609)和7.0.0(自己构建20161128)。 (关于MS Visual Studio 2015,有一个类似的问题here。)
指令'#error'导致预处理器报告致命错误。形成“#error”后面的其余部分的标记用作错误消息。
所以,也许我只是不知道"致命错误"是。 gcc选项-Wfatal-errors
意味着致命错误会导致编译终止,但manuals中没有任何内容定义它(除非我错过了它)。然而,对this question的回答更加谨慎,并说:
[#error]使翻译单元格式不正确(即导致编译失败)
我不会读到同样的说法就是说编译在那时终止。
那么,gcc的这种行为是否正确?
答案 0 :(得分:0)
“错误”和“致命错误”直到最近才成为gcc中的单独类别。人们会说“致命错误”只是为了确保您理解编译不会产生预期的目标文件。 “警告”和“错误”总是分开的,但这对每个人来说并不明显。如果你没有被告知,你可能会认为警告是一种错误。
我不知道是否有一个版本的gcc在#error
之后立即终止,但我对此表示怀疑。在cpp实际上是一个单独的程序的时代,它可能会在预处理阶段结束时终止,而不会调用编译器;这会导致更少的错误消息。 (但不是在-pipe
被用来同时运行它们的时候!)
您可以针对cpp手册报告错误。它使用“致命错误”的方式与gcc手册其余部分中术语的使用不一致。