ZHCUAV8W january 1998 – march 2023 66AK2E05 , 66AK2H06 , 66AK2H12 , 66AK2H14 , AM1705 , AM1707 , AM1802 , AM1806 , AM1808 , AM1810 , AM5K2E04 , OMAP-L132 , OMAP-L137 , OMAP-L138 , SM470R1B1M-HT , TMS470R1A288 , TMS470R1A384 , TMS470R1A64 , TMS470R1B1M , TMS470R1B512 , TMS470R1B768
編譯器和鏈接器的主要功能之一是報告源代碼程序的診斷消息。診斷消息指示程序可能出了問題。當編譯器或鏈接器檢測到可疑情況時,它會采用以下格式顯示一條消息:
"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沒有上下文信息,就很難確定錯誤指的是什么。