#error做什么?

时间:2017-07-27 13:42:24

标签: gcc c-preprocessor

在其他地方(例如,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。)

根据GNU CPP manual

  

指令'#error'导致预处理器报告致命错误。形成“#error”后面的其余部分的标记用作错误消息。

所以,也许我只是不知道"致命错误"是。 gcc选项-Wfatal-errors意味着致命错误会导致编译终止,但manuals中没有任何内容定义它(除非我错过了它)。然而,对this question的回答更加谨慎,并说:

  

[#error]使翻译单元格式不正确(即导致编译失败)

我不会读到同样的说法就是说编译在那时终止。

那么,gcc的这种行为是否正确?

1 个答案:

答案 0 :(得分:0)

“错误”和“致命错误”直到最近才成为gcc中的单独类别。人们会说“致命错误”只是为了确保您理解编译不会产生预期的目标文件。 “警告”和“错误”总是分开的,但这对每个人来说并不明显。如果你没有被告知,你可能会认为警告是一种错误。

我不知道是否有一个版本的gcc在#error之后立即终止,但我对此表示怀疑。在cpp实际上是一个单独的程序的时代,它可能会在预处理阶段结束时终止,而不会调用编译器;这会导致更少的错误消息。 (但不是在-pipe被用来同时运行它们的时候!)

您可以针对cpp手册报告错误。它使用“致命错误”的方式与gcc手册其余部分中术语的使用不一致。