常見問題
- 如何讓 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)。如果此自動配置不足,您可以透過執行 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 子系統。
為什麼我的檔案在格式化時會損壞?
如果透過帶有符號連結(symlinks)的路徑開啟工作區資料夾,檔案可能會損壞(並且其他功能可能會失敗)(問題 vscode-cpptools#5061)。解決方法是使用將符號連結解析為其目標的路徑開啟工作區資料夾。
如何重新建立 IntelliSense 資料庫?
從擴充套件的 0.12.3 版本開始,有一個命令可以重置您的 IntelliSense 資料庫。開啟命令面板(⇧⌘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 discussions 開始討論,或者如果您發現需要修復的問題,請在 GitHub issues 提交問題。
如果您遇到的擴充套件問題我們無法根據您的問題報告中的資訊進行診斷,我們可能會要求您啟用除錯日誌記錄並向我們傳送您的日誌。有關如何獲取 C/C++ 擴充套件日誌的資訊,請參閱C/C++ 擴充套件日誌記錄。