相信,絕大多數小夥伴兒編譯 C++
或者其它語言的程序都遇到過編譯錯誤。今天簡單總結一下如何使用錯誤列表(Error List) 和輸出窗口(Output) 排查編譯 C++
代碼產生的編譯錯誤。簡單的錯誤,經過錯誤列表就能夠搞定,可是一些複雜的錯誤,只經過錯誤列表極可能是沒法解決的,須要藉助輸出窗口的幫助。ide
錯誤列表能夠用來查看編譯時的錯誤、警告等信息。在一條記錄上雙擊,便可切換到對應的代碼行,是咱們排查編譯錯誤的好幫手。通常狀況下,若是編譯出錯,錯誤列表會自動彈出來,若是沒有彈出來,能夠手動打開。函數
1. 打開方式ui
咱們能夠在 View
菜單下找到 Error List
,點擊便可打開。對應的快捷鍵是 ctrl + \, e
(按住ctrl
,而後依次按 \
和 e
便可)。3d
若是以爲麻煩,仍是但願編譯出錯時自動打開錯誤列表的話,咱們能夠在Tools -> Options-> Projects and Solutions -> General
裏設置。調試
勾選 Always show Error List if build finishes with errors
,能夠在編譯完成後,若是有錯誤,則會自動彈出 Error List
窗口。code
2. 錯誤列表界面概覽cdn
咱們先經過一張圖來了解下錯誤列表。blog
咱們發現有 7 列,每一列都有它的做用。排序
第 1 列:Category
,以圖標的形式表示信息的類型。進程
大紅叉
是真正的錯誤。
小紅叉
通常是智能提示給出的,不是真正意義上的錯誤。對是否能成功編譯沒有影響。
黃色三角形+歎號
通常是警告信息。
圓形+歎號
通常是提示信息。
第 2 列:Default Order
,提示信息的編號。我沒關注過。
第 3 列:Description
,簡要描述,能夠粗略判斷下錯誤。
第 4 列:File
,文件。若是是頭文件的話,有可能須要排查包含的此頭文件的源文件。
第 5 列:Line
,行號。
第 6 列:Column
,列號。
第 7 列:Project
,工程。提示信息關聯的工程,若是項目裏有多個工程,能夠根據此列進行一個初步的過濾。
若是不想顯示 Intellisense Error
,能夠右鍵,取消勾選 Show IntelliSense Errors
。
能夠根據任意一列排序(雙擊對應列標題便可排序),或者 右鍵
,Sort By
選擇須要排序的列。
能夠顯示或者隱藏任意一列,右鍵
, Show Columns
選擇須要顯示/隱藏的列便可。
3. 過濾
Error List
是支持過濾的,善用過濾能夠幫咱們快速找到關心的信息。
點擊左側漏洞形狀的按鈕
旁邊的下拉按鈕,能夠看到三種選項:
Open Documents
:只保留與當前全部打開的文檔相關的信息。
Current Project
:只保留全部屬於當前工程的信息。
Curent Document
:只保留與當前文檔相關的信息。
能夠在右側的 Search Error List
編輯框輸入過濾的關鍵字,不過遺憾的是不支持模糊匹配和正則匹配。
下面是我錄製的一個基本的過濾示例,你們能夠直接感覺下。
輸出窗口不只能夠顯示各類調試信息,還能夠顯示編譯的輸出信息,好比編譯錯誤、編譯警告等。有些編譯錯誤,僅經過錯誤列表不能解決,這時候咱們須要藉助輸出窗口的幫助。
1. 打開方式
咱們能夠在 View
菜單下找到 Output
,點擊便可打開。對應的快捷鍵是 ctrl + alt + o
。
若是但願在編譯時自動打開輸出窗口的話,咱們能夠在Tools -> Options-> Projects and Solutions -> General
裏設置。
勾選 Show Output window when build starts
能夠在編譯開始的時候自動彈出輸出窗口。能夠參考錯誤列表打開方式的截圖。
2. 簡要介紹
輸出窗口用法比較簡單,鼠標移動到對應的按鈕上就有懸浮提示,不一一介紹了。咱們能夠根據 Show output from:
選項過濾不一樣來源的信息。我見過如下幾種:
Build
:編譯產生的信息。
Build Order
:編譯產生的信息,按順序顯示。
Debug
:調試輸出信息。若是被調試的進程經過 OutputDebugString()
或等價的 API
輸出調試信息,則會顯示在此分類下。
Source Control - Git
:來自版本管理系統 Git
的信息,vs
檢測到當前有代碼被 Git
管理,則會出現此分類。
Source Control - Team Foundation
:來自版本管理系統 Team Foundation
的信息,若是 vs
檢測到當前代碼被TFS
管理,則會出現此分類。
Solution
:工程加載類消息。若是某個工程加載失敗,會在該分類下顯示錯誤提示。
**說明:**若是某一行包含 path\to\file(line):
形式的信息,雙擊便可跳轉到對應文件的特定行。
在檢查編譯錯誤時,咱們使用的是 Build
和 Build Order
。其中的 Build Order
尤爲有用,能夠按順序顯示輸出信息。試想,若是解決方案(Solution
)下有不少項目(Project
)的話,編譯的時候,項目間的編譯輸出頗有可能混到一塊兒,不利於咱們排查。經過 Build Order
可讓輸出有序。而後咱們能夠按 ctrl + home
鍵跳轉到開頭,而後搜索搜索error
,就能夠快速找到第一條錯誤信息了。下面是兩個使用輸出窗口排查編譯錯誤的實戰。
實戰1. 查找頭文件中的編譯錯誤實戰
下圖中的編譯錯誤,所有提示出如今頭文件中。
咱們雙擊後會跳轉到頭文件。
除了知道錯誤發生在第 6 行,咱們並不能獲得更多有用信息了。咱們須要找到是哪一個源文件包含了這個頭文件,到源文件裏進一步查找緣由。這時候咱們須要切換到輸出窗口了。
從上圖中咱們看不出來究竟是哪一個源文件包含了出問題的頭文件。咱們須要切換到 Build Order
,以下圖:
咱們發現 MFCApplication2.cpp
,MFCActiveXControl1.cpp
和 MFCActiveXControl2.cpp
包含了 d4d.h
。咱們能夠進行下一步的排查了,由於這個問題比較有意思,具體排查過程會單獨寫一篇文章。
實戰2. 查找名字解析錯誤實戰
下圖是嘗試匹配重載函數失敗時,錯誤列表給出的錯誤提示。
從提示中咱們得知,在 4
個重載函數中沒有一個能匹配給定的兩個參數。可是編譯器具體嘗試匹配了哪些函數呢?咱們沒法從錯誤列表得知。不過咱們能夠經過輸出窗口查看編譯器具體嘗試匹配了哪些函數,以下圖:
咱們能夠發現,在咱們提供的四個重載函數中,沒有一個函數能夠徹底匹配給定的兩個參數,編譯器就懵逼了,不知道應該選擇哪一個了,因此就報錯了。
本例只是一個超級簡單的例子,並不能很好的突出輸出窗口的做用。通常涉及模板的編譯錯誤會有一大串。這時候經過輸出窗口查看具體的匹配過程就很重要了。
Build Order
可讓輸出有序,在查找
多工程編譯輸出的時候,有助於咱們快速找到相關代碼。
https://docs.microsoft.com/en-us/visualstudio/ide/reference/error-list-window?view=vs-2019
https://docs.microsoft.com/en-us/visualstudio/ide/reference/output-window?view=vs-2019