常見問題
- 如何讓 IntelliSense 正確運作?
- c_cpp_properties.json 中的 includePath 與 browse.path 有什麼區別?
- 為什麼標準程式庫(Standard Library)類型下方會出現紅色波浪底線?
- 如何讓新的 IntelliSense 在 Windows 的 MinGW 上運作?
- 如何讓新的 IntelliSense 在 Windows Subsystem for Linux (WSL) 上運作?
- 為什麼我的檔案在格式化後會損毀?
- 如何重新建立 IntelliSense 資料庫?
- 什麼是 ipch 資料夾?
- 如何停用 IntelliSense 快取 (ipch)?
- 如何設定偵錯 (debugging)?
- 如何啟用偵錯符號 (debug symbols)?
- 為什麼偵錯功能無法運作?
- 如果懷疑是 C/C++ 擴充功能的問題,該怎麼辦?
如何讓 IntelliSense 正確運作?
在沒有任何設定的情況下,該擴充功能會嘗試透過搜尋您的工作區資料夾並模擬電腦上找到的編譯器(例如 Windows 的 cl.exe/MinGW,macOS/Linux 的 gcc/clang)來定位標頭檔。如果此自動設定不足以滿足需求,您可以執行 C/C++: Edit Configurations (UI) 指令來修改預設值。在該視圖中,您可以變更想要模擬的編譯器、想要使用的包含檔案路徑、預處理器定義等等。
或者,如果您安裝了與我們擴充功能對接的建置系統擴充功能,您可以讓該擴充功能為您提供設定。例如,CMake Tools 擴充功能可以設定使用 CMake 建置系統的專案。使用 C/C++: Change Configuration Provider... 指令,即可啟用任何此類擴充功能來為 IntelliSense 提供設定。
對於不支援建置系統擴充功能的專案,第三種選擇是使用 compile_commands.json 檔案(前提是您的建置系統支援產生此檔案)。在組態 UI 的「進階」部分中,您可以提供 compile_commands.json 的路徑,擴充功能將會使用該檔案中列出的編譯資訊來設定 IntelliSense。
注意:如果擴充功能無法解析原始程式碼中的任何 #include 指令,它將不會顯示原始程式檔內容的程式碼檢查 (linting) 資訊。如果您查看 VS Code 中的問題 (Problems) 視窗,擴充功能會提供關於無法定位哪些檔案的更多資訊。如果您無論如何都想顯示程式碼檢查資訊,可以更改 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 檔案並進行修改。
為什麼標準程式庫(Standard Library)類型下方會出現紅色波浪底線?
造成此問題最常見的原因是缺少包含路徑和定義。最簡單的解決方法是在 c_cpp_properties.json 中將 compilerPath 設定為您的編譯器路徑。
如何讓新的 IntelliSense 在 Windows 的 MinGW 上運作?
請參閱在 Visual Studio Code 中開始使用 C++ 與 Mingw-w64。
如何讓新的 IntelliSense 在 Windows Subsystem for Linux (WSL) 上運作?
請參閱在 Visual Studio Code 中開始使用 C++ 與 Windows Subsystem for Linux。
為什麼我的檔案在格式化後會損毀?
如果工作區資料夾是透過帶有符號連結 (symlinks) 的路徑開啟的,檔案可能會損毀(其他功能也可能會失敗)(請參閱問題 vscode-cpptools#5061)。解決方法是使用已解析符號連結至目標的路徑來開啟工作區資料夾。
如何重新建立 IntelliSense 資料庫?
從擴充功能的 0.12.3 版本開始,提供了一個重設 IntelliSense 資料庫的指令。開啟命令選擇區 (⇧⌘P (Windows, Linux Ctrl+Shift+P)) 並選擇 C/C++: Reset IntelliSense Database 指令。
什麼是 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": <字串>
此設定允許您為快取路徑設定工作區或全域覆寫。例如,如果您想為所有工作區資料夾共用單一快取位置,請開啟 VS Code 設定,並新增一個 IntelliSense Cache Path 的使用者設定。
"C_Cpp.intelliSenseCacheSize": <數字>
此設定允許您限制擴充功能執行的快取量。這是一個近似值,但擴充功能將盡最大努力使快取大小儘可能接近您設定的限制。如果您按照上述說明跨工作區共用快取位置,您仍然可以增加/減少該限制,但應確保新增一個 IntelliSense Cache Size 的使用者設定。
如何停用 IntelliSense 快取 (ipch)?
如果您不想使用 IntelliSense 快取功能(例如為了規避僅在啟用快取時才會發生的錯誤),可以透過將 IntelliSense Cache Size 設定為 0(或在 JSON 設定編輯器中設定 "C_Cpp.intelliSenseCacheSize": 0")來停用該功能。如果您發現磁碟寫入過多(特別是在編輯標頭檔時),停用快取也可能有幫助。
如何設定偵錯 (debugging)?
偵錯工具需要經過設定,才能知道要使用哪個執行檔與偵錯工具。
從主選單中,選擇 執行 (Run) > 新增設定... (Add Configuration...)。
此時將開啟 launch.json 檔案供您編輯新的設定。預設設定通常可以直接運作,但您需要明確指定 program 設定。
請參閱設定 C/C++ 偵錯以取得關於如何設定偵錯工具的更深入文件。
如何啟用偵錯符號 (debug symbols)?
啟用偵錯符號取決於您使用的編譯器類型。以下列出了一些編譯器以及啟用偵錯符號所需的編譯器選項。
如有疑問,請查閱編譯器的文件,以了解在輸出中包含偵錯符號所需的選項。這可能是 -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 檔案中。
為什麼偵錯功能無法運作?
我的中斷點未觸發
當您開始偵錯時,如果中斷點未繫結(非實心紅圓圈)或未被觸發,您可能需要在編譯時啟用偵錯符號。
偵錯已啟動,但堆疊追蹤 (stack trace) 中的所有行都是灰色的
如果您的偵錯工具顯示灰色的堆疊追蹤,無法在中斷點停止,或者呼叫堆疊中的符號是灰色的,那麼您的執行檔在編譯時未包含偵錯符號。
如果懷疑是 C/C++ 擴充功能的問題,該怎麼辦?
如果您有任何其他問題,請在 GitHub discussions 發起討論,或者如果您發現需要修復的問題,請在 GitHub issues 提出。
如果您遇到的擴充功能問題無法根據您回報的問題報告內容進行診斷,我們可能會請您啟用偵錯記錄並傳送給我們。請參閱 C/C++ 擴充功能記錄了解如何取得 C/C++ 擴充功能的記錄檔。