常見問題
- 如何讓 IntelliSense 正常運作?
- c_cpp_properties.json 中的 includePath 和 browse.path 有何差異?
- 為什麼我在標準程式庫類型下看到紅色波浪線?
- 如何讓新的 IntelliSense 與 Windows 上的 MinGW 搭配運作?
- 如何讓新的 IntelliSense 與適用於 Linux 的 Windows 子系統搭配運作?
- 為什麼我的檔案在格式化時損毀?
- 如何重新建立 IntelliSense 資料庫?
- 什麼是 ipch 資料夾?
- 如何停用 IntelliSense 快取 (ipch)?
- 如何設定偵錯?
- 如何啟用偵錯符號?
- 為什麼偵錯無法運作?
- 如果我懷疑 C/C++ 擴充功能有問題,該怎麼辦?
如何讓 IntelliSense 正常運作?
在沒有任何組態的情況下,擴充功能會嘗試透過搜尋您的工作區資料夾,以及模擬在您的電腦上找到的編譯器 (例如,適用於 Windows 的 cl.exe/MinGW、適用於 macOS/Linux 的 gcc/clang) 來尋找標頭。(例如,適用於 Windows 的 cl.exe/MinGW、適用於 macOS/Linux 的 gcc/clang)。如果此自動組態不足,您可以執行C/C++:編輯組態 (UI) 命令來修改預設值。在該檢視中,您可以變更要模擬的編譯器、要使用的包含檔案路徑、前置處理器定義等等。
或者,如果您安裝與我們的擴充功能介面的建置系統擴充功能,您可以允許該擴充功能為您提供組態。例如,CMake Tools 擴充功能可以設定使用 CMake 建置系統的專案。使用 C/C++:變更組態提供者... 命令來啟用任何這類擴充功能,以提供 IntelliSense 的組態。
對於沒有建置系統擴充功能支援的專案,第三個選項是使用 compile_commands.json 檔案 (如果您的建置系統支援產生此檔案)。在 [組態 UI] 的 [進階] 區段中,您可以提供 compile_commands.json
的路徑,擴充功能將使用該檔案中列出的編譯資訊來設定 IntelliSense。
注意:如果擴充功能無法解析原始程式碼中的任何 #include
指示詞,則不會顯示原始程式檔主體的 Linting 資訊。如果您檢查 VS Code 中的 [問題] 視窗,擴充功能會提供更多關於無法找到哪些檔案的資訊。如果您仍然想要顯示 Linting 資訊,您可以變更 C_Cpp.errorSquiggles
設定的值。
includePath 和 browse.path 之間有何差異?
這兩個設定可在 c_cpp_properties.json
中使用,而且可能會造成混淆。
includePath
這個路徑字串陣列是由「預設」IntelliSense 引擎使用,其提供語意感知 IntelliSense 功能。包含路徑與您透過 -I
參數傳送至編譯器的路徑相同。當剖析您的原始程式檔時,IntelliSense 引擎會在嘗試解析時,將這些路徑前置到您的 #include 指示詞所指定的檔案。除非這些路徑以 /**
結尾,否則不會以遞迴方式搜尋這些路徑。
browse.path
這個路徑字串陣列是由「標籤剖析器」(「瀏覽引擎」) 使用,其會使用全域符號資訊填入資料庫。這個引擎會遞迴列舉指定路徑下的所有檔案,並在標籤剖析您的專案資料夾時,將其追蹤為潛在的包含項目。若要停用路徑的遞迴列舉,您可以將 /*
附加到路徑字串。
當您第一次開啟工作區時,擴充功能會將 ${workspaceFolder}/**
新增至 includePath
,而 browse.path
則保持未定義 (因此預設為 includePath
)。如果這不符合需求,您可以開啟 c_cpp_properties.json 檔案並加以變更。
為什麼我在標準程式庫類型下看到紅色波浪線?
最常見的原因是缺少包含路徑和定義。修正此問題最簡單的方式是在 c_cpp_properties.json 中將 compilerPath
設定為編譯器的路徑。
如何讓新的 IntelliSense 與 Windows 上的 MinGW 搭配運作?
請參閱在 Visual Studio Code 中開始使用 C++ 和 Mingw-w64。
如何讓新的 IntelliSense 與適用於 Linux 的 Windows 子系統搭配運作?
請參閱在 Visual Studio Code 中開始使用 C++ 和適用於 Linux 的 Windows 子系統。
為什麼我的檔案在格式化時損毀?
如果透過具有符號連結的路徑開啟工作區資料夾 (問題 vscode-cpptools#5061),檔案可能會損毀 (而且其他功能可能會失敗)。因應措施是使用已將符號連結解析為其目標的路徑開啟工作區資料夾。
如何重新建立 IntelliSense 資料庫?
從擴充功能 0.12.3 版開始,有一個命令可以重設您的 IntelliSense 資料庫。開啟 [命令 Palette] (⇧⌘P (Windows、Linux Ctrl+Shift+P)),然後選擇 C/C++:重設 IntelliSense 資料庫 命令。
什麼是 ipch 資料夾?
語言伺服器會快取關於包含標頭檔的資訊,以改善 IntelliSense 的效能。當您在工作區資料夾中編輯 C/C++ 檔案時,語言伺服器會將快取檔案儲存在 ipch
資料夾中。根據預設,ipch
資料夾會儲存在使用者目錄下。具體而言,它會儲存在 Windows 上的 %LocalAppData%/Microsoft/vscode-cpptools
、Linux 上的 $XDG_CACHE_HOME/vscode-cpptools/
(如果未定義 XDG_CACHE_HOME
,則為 $HOME/.cache/vscode-cpptools/
) 和 macOS 上的 $HOME/Library/Caches/vscode-cpptools/
下。藉由將使用者目錄作為預設路徑,它會為每個使用者的擴充功能建立一個快取位置。由於快取大小限制會套用至快取位置,因此每個使用者都有一個快取位置,將會將快取的磁碟空間使用量限制為每個使用預設設定值的使用者的該資料夾。
VS Code 每個工作區儲存資料夾未使用,因為 VS Code 提供的位置並不廣為人知,而且我們不想將 GB 的檔案寫入使用者可能看不到或不知道在哪裡找到它們的位置。
考慮到這一點,我們知道我們將無法滿足每個不同開發環境的需求,因此我們提供了設定,讓您可以自訂最適合您情況的方式。
"C_Cpp.intelliSenseCachePath": <string>
此設定可讓您設定工作區或全域覆寫的快取路徑。例如,如果您想要為所有工作區資料夾共用單一快取位置,請開啟 VS Code 設定,並為 [IntelliSense 快取路徑] 新增 [使用者設定]。
"C_Cpp.intelliSenseCacheSize": <number>
此設定可讓您設定擴充功能執行快取量的限制。這是一個近似值,但擴充功能會盡最大努力讓快取大小盡可能接近您設定的限制。如果您如上所述在工作區之間共用快取位置,您仍然可以增加/減少限制,但您應該確定您為 [IntelliSense 快取大小] 新增了 [使用者設定]。
如何停用 IntelliSense 快取 (ipch)?
如果您不想使用 IntelliSense 快取功能 (例如,為了規避可能只在啟用快取時發生的錯誤),您可以將 [IntelliSense 快取大小] 設定設定為 0 (或 JSON 設定編輯器中的 "C_Cpp.intelliSenseCacheSize": 0"
) 來停用此功能。如果您看到過多的磁碟寫入,尤其是在編輯標頭時,停用快取也可能很有幫助。
如何設定偵錯?
需要設定偵錯工具,以了解要使用的可執行檔和偵錯工具
從主功能表選取 [執行] > [新增組態...]。
現在將開啟 launch.json
檔案以進行編輯,並包含新的組態。預設設定可能會運作,但您需要指定 program
設定。
請參閱設定 C/C++ 偵錯,以取得關於如何設定偵錯工具的更深入文件。
如何啟用偵錯符號?
啟用偵錯符號取決於您使用的編譯器類型。以下是一些編譯器和啟用偵錯符號所需的編譯器選項。
如有疑問,請查看編譯器的文件,以了解在輸出中包含偵錯符號所需的選項。這可能是 -g
或 --debug
的某種變體。
Clang (C++)
- 如果您手動叫用編譯器,請新增
--debug
選項。 - 如果您使用的是指令碼,請確定已設定
CXXFLAGS
環境變數。例如,export CXXFLAGS="${CXXFLAGS} --debug"
。 - 如果您使用的是 CMake,請確定已設定
CMAKE_CXX_FLAGS
。例如,export CMAKE_CXX_FLAGS=${CXXFLAGS}
。
Clang (C)
請參閱 Clang C++,但使用 CFLAGS
而不是 CXXFLAGS
。
gcc 或 g++
如果您手動叫用編譯器,請新增 -g
選項。
cl.exe
符號位於 *.pdb
檔案中。
為什麼偵錯無法運作?
我的中斷點未命中
當您開始偵錯時,如果您的中斷點未繫結 (實心紅圈) 或未命中,您可能需要在編譯期間啟用偵錯符號。
偵錯開始,但我的堆疊追蹤中的所有行都是灰色
如果您的偵錯工具顯示灰色堆疊追蹤、不會在中斷點停止,或呼叫堆疊中的符號為灰色,則表示您的可執行檔是在沒有偵錯符號的情況下編譯的。
如果我懷疑 C/C++ 擴充功能有問題,該怎麼辦?
如果您有任何其他問題,請在 GitHub 討論區開始討論,或者如果您發現需要修正的問題,請在 GitHub 問題中提交問題。
如果您遇到我們無法根據您問題報告中的資訊診斷的擴充功能問題,我們可能會要求您啟用偵錯記錄並將您的記錄傳送給我們。請參閱C/C++ 擴充功能記錄,以了解如何取得 C/C++ 擴充功能記錄。