現已釋出!閱讀關於 11 月新增功能和修復的內容。

常見問題

如何使 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 的“Advanced”部分,您可以提供 compile_commands.json 的路徑,擴充套件程式將使用該檔案中列出的編譯資訊來配置 IntelliSense。

注意:如果擴充套件程式無法解析原始碼中的任何 #include 指令,它將不會顯示原始檔正文的 linting 資訊。如果您在 VS Code 的“Problems”視窗中檢視,擴充套件程式將提供有關其無法找到檔案的更多資訊。如果您仍希望顯示 linting 資訊,可以更改 C_Cpp.errorSquiggles 設定的值。

includePath 和 browse.path 有什麼區別?

這兩個設定在 c_cpp_properties.json 中可用,並且容易引起混淆。

includePath

此路徑字串陣列用於“Default”IntelliSense 引擎,該引擎提供語義感知的 IntelliSense 功能。include 路徑與您透過 -I 開關傳遞給編譯器的路徑相同。在解析原始檔時,IntelliSense 引擎在嘗試解析 #include 指令時,會將這些路徑新增到指令中指定的檔案前面。除非這些路徑以 /** 結尾,否則它們不會被遞迴搜尋。

browse.path

此路徑字串陣列用於“Tag Parser”(“browse engine”),該引擎將全域性符號資訊填充到資料庫中。該引擎將遞迴列舉指定路徑下的所有檔案,並在標記解析您的專案資料夾時將它們跟蹤為潛在的 include。要停用對路徑的遞迴列舉,可以在路徑字串後附加 /*

首次開啟工作區時,擴充套件程式會將 ${workspaceFolder}/** 新增到 includePath,而 browse.path 將保持未定義(因此預設為 includePath)。如果這不是您想要的,可以開啟 c_cpp_properties.json 檔案進行更改。

為什麼標準庫型別下會出現紅色波浪線?

最常見的原因是缺少 include 路徑和定義。最簡單的修復方法是在 c_cpp_properties.json 中將 compilerPath 設定為您的編譯器的路徑。

如何在 Windows 上使用 MinGW 使新的 IntelliSense 工作?

請參閱 在 Visual Studio Code 中開始使用 C++ 和 Mingw-w64

如何在適用於 Linux 的 Windows 子系統上使用新的 IntelliSense?

請參閱 在 Visual Studio Code 中開始使用 C++ 和適用於 Linux 的 Windows 子系統

為什麼我的檔案在格式化時會損壞?

如果透過包含符號連結的路徑開啟工作區資料夾(問題 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": <string>

此設定允許您為快取路徑設定工作區或全域性覆蓋。例如,如果您想為所有工作區資料夾共享一個快取位置,請開啟 VS Code 設定,併為 **IntelliSense Cache Path** 新增一個 User 設定。

"C_Cpp.intelliSenseCacheSize": <number>

此設定允許您限制擴充套件程式快取的數量。這是一個近似值,但擴充套件程式將盡最大努力使快取大小盡可能接近您設定的限制。如果您在工作區之間共享快取位置(如上所述),您仍然可以增加/減少限制,但您應該確保為 **IntelliSense Cache Size** 新增一個 User 設定。

如何停用 IntelliSense 快取 (ipch)?

如果您不想使用 IntelliSense 快取功能(例如,為了規避可能僅在啟用快取時發生的 bug),您可以透過將 **IntelliSense Cache Size** 設定為 0(或在 JSON 設定編輯器中設定為 "C_Cpp.intelliSenseCacheSize": 0")來停用該功能。如果您看到過度的磁碟寫入,尤其是在編輯標頭檔案時,停用快取也可能是有益的。

如何設定除錯?

偵錯程式需要進行配置,以便知道要使用哪個可執行檔案和偵錯程式。

從主選單中,選擇 **Run** > **Add Configuration...**。

現在將開啟 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 discussions 上發起討論,如果您發現需要修復的問題,請在 GitHub issues 上提交問題。

如果您遇到擴充套件程式問題,而我們無法根據您的問題報告中的資訊進行診斷,我們可能會要求您啟用除錯日誌記錄並將日誌傳送給我們。有關如何獲取 C/C++ 擴充套件日誌的資訊,請參閱 C/C++ 擴充套件日誌記錄

© . This site is unofficial and not affiliated with Microsoft.