ZHCUAU3J January 2018 – March 2024
编译器和链接器的主要功能之一是报告源代码程序的诊断消息。诊断消息指示程序可能出了问题。当编译器或链接器检测到可疑情况时,它会采用以下格式显示一条消息:
"file.c", line n : diagnostic severity : diagnostic message
"file.c" | 所涉及的文件的名称 |
line n : | 诊断适用的行号 |
diagnostic severity | 诊断消息的严重性(严重性类别说明如下) |
diagnostic message | 描述问题的文本 |
诊断消息的严重性如下:
诊断消息以类似于以下示例的形式写入标准错误:
"test.c", line 5: error: a break statement may only be used within a loop or switch
break;
^
默认情况下不会打印源代码行。使用 --verbose_diagnostics 编译器选项来显示源代码行和错误位置。上面的示例使用了此选项。
消息会标识诊断中所涉及的文件和行,并且源行本身(位置由 ^ 字符表示)跟在消息之后。如果几条诊断消息适用于一个源行,则每条诊断消息都具有所示的形式:源代码行的文本会显示几次,每次都显示在一个适合的位置。
必要时,长消息会换行以便使用多行显示。
可以使用 --display_error_number 命令行选项来请求将诊断的数字标识符包含在诊断消息中。如果显示了诊断标识符,诊断标识符还指示是否可以在命令行上覆盖诊断的严重性。如果可以覆盖严重性,则诊断标识符包括后缀 -D(酌情处理);否则,不存在后缀。例如:
"Test_name.c", line 7: error #64-D: declaration does not declare anything
struct {};
^
"Test_name.c", line 9: error #77: this declaration has no storage class or type specifier
xxxxx;
^
由于错误是根据特定上下文中的严重性确定的,因此错误在某些情况下可以是酌情处理的,而在其他情况下则不是。所有警告、备注和建议诊断都是酌情处理的。
对于某些消息,实体(函数、局部变量、源文件等)列表很有用;实体在初始错误消息之后列出:
"test.c", line 4: error: more than one instance of overloaded function "f"
matches the argument list:
function "f(int)"
function "f(float)"
argument types are: (double)
f(1.5);
^
在某些情况下,还会提供附加的上下文信息。 特别是,如果前端在执行模板实例化时或在生成构造函数、析构函数或赋值运算符函数时发出诊断消息,上下文信息很有用。例如:
"test.c", line 7: error: "A::A()" is inaccessible
B x;
^
detected during implicit generation of "B::B()" at line 7
没有上下文信息,就很难确定错误指的是什么。