在某些情況下,您可能需要手動設定C++專案,讓IntelliSense正常運作。 對於 MSBuild 專案(基於 .vcxproj 檔案),你可以在專案屬性中調整設定。 對於非 MSBuild 專案,你可以在 CppProperties.json 專案根目錄的檔案中調整設定。 在某些情況下,你可能需要建立一個提示檔,幫助 IntelliSense 理解巨集定義。 Visual Studio IDE 可協助您找出並修正 IntelliSense 問題。
單檔案 IntelliSense
當你打開專案中未包含的檔案時,Visual Studio 會提供部分 IntelliSense 支援,但預設不會顯示錯誤波浪線。 如果導航列顯示「雜項檔案」,那可能就是為什麼你看不到錯誤程式碼下的波浪線,或為什麼前置處理器的巨集未被定義的原因。
檢查錯誤清單
如果檔案無法以單檔案模式開啟,且 IntelliSense 運作不正常,第一個檢查的地方就是 錯誤清單 視窗。 若要查看目前原始檔案的所有 IntelliSense 錯誤,以及所有包含的標頭檔案,請在下拉選單中選擇 Build + IntelliSense :
IntelliSense 最多產生 1,000 個錯誤。 如果來源檔案所包含的標頭檔案中錯誤數超過 1,000 個,則該原始碼檔案在開頭只會顯示一個錯誤波浪線。
確定 #include 路徑正確
MSBuild 專案
如果你在 Visual Studio IDE 外執行建置,且建置成功但 IntelliSense 錯誤,可能是你的命令列與一個或多個設定的專案設定不同步。 以滑鼠右鍵按兩下 [方案總管] 中的項目節點,並確定目前組態和平臺的所有 #include 路徑都正確。 如果路徑在所有組態和平臺中都相同,您可以選取 [所有組態] ,然後 [所有平臺],然後確認路徑正確無誤。
若想查看像 VC_IncludePath 這類建置巨集的當前值,請選擇 「包含目錄」 下拉選單。 然後選擇 <編輯>,再選擇 巨集 按鈕。
Makefile 專案
對於基於 NMake 專案範本的 Makefile 專案,請在設定屬性中選擇 NMake,然後在 IntelliSense 類別中選擇包含搜尋路徑:
CMake 專案
對於 CMake 專案,請確保在 CMakeLists.txt 中正確地為所有配置指定 #include 路徑。 其他專案類型可能需要檔案 CppProperties.json 。 欲了解更多資訊,請參閱 「配置程式碼導航與 CppProperties.json。 請確定檔案中所定義之每個組態的路徑都正確無誤。
如果檔案中有 CppProperties.json 語法錯誤,那受影響檔案中的 IntelliSense 就是錯誤的。 Visual Studio 會在輸出視窗中顯示錯誤。
標籤解析器問題
標籤解析器是一種模糊 的 C++ 解析器,用於瀏覽和導航。 它速度快,但不會嘗試完全理解每一個程式碼結構。
例如,它不會評估預處理器巨集,因此可能會錯誤解析大量使用這些巨集的程式碼。 當標籤解析器遇到不熟悉的程式碼結構時,可能會跳過整個該區域的程式碼。
在Visual Studio中,有兩種常見的方式會說明此問題:
IDE 提供為已定義的函式建立函式定義。
如果導航列顯示最內層的巨集,則表示已跳過目前的函數定義。
程式碼片段顯示了在 main 函式中使用的 do_if 宏定義。 標籤解析器無法理解這個巨集,因此導航下拉選單未能顯示當前函式的名稱為 main,而是顯示了巨集的名稱:do_if。
要解決這類問題,可以在解決方案目錄的根目錄中新增一個檔案 cpp.hint 。 如需詳細資訊,請參閱 提示檔案。
標籤剖析器錯誤會出現在 錯誤清單 視窗中。
使用診斷記錄來驗證項目設定
要檢查 IntelliSense 編譯器是否正在使用正確的編譯器選項,包括包含路徑與預處理器宏,請啟用 IntelliSense 命令行的診斷日誌記錄功能。
打開工具>選項欄,展開「所有設定>語言」>C/C++>IntelliSense>診斷日誌區塊。
選擇「將診斷日誌記錄到輸出視窗」的勾選框。
將 日誌等級 設定為 5(最詳細)。
將 日誌過濾 值設為 8(IntelliSense 日誌)。
打開 工具>選項 對話框,展開 文字編輯器>C/C++>Advanced 區塊。
在 診斷日誌 群組中,將 啟用日誌 選項設為 True。
將 日誌等級 值設為 5(最詳細)。
將日誌過濾器值設為 8(IntelliSense 日誌)。
請選擇 [確定]。
輸出視窗現在顯示傳給 IntelliSense 編譯器的指令列。 以下是範例輸出:
[IntelliSense] Configuration Name: Debug|Win32
[IntelliSense] Toolset IntelliSense Identifier:
[IntelliSense] command line options:
/c
/I.
/IC:\Repo\Includes
/DWIN32
/DDEBUG
/D_DEBUG
/Zc:wchar_t-
/Zc:forScope
/Yustdafx.h
這些資訊或許能幫助你理解為什麼 IntelliSense 會提供不準確的資訊。 例如,如果你專案的 Include 目錄包含 $(MyVariable)\Include,而診斷日誌顯示 /I\Include 為 Include 路徑,表示該 $(MyVariable) 路徑未被評估,且已從最終 include 路徑中移除。
關於 IntelliSense 建置
Visual Studio 會使用專用C++編譯程式來建立和維護支援所有 IntelliSense 功能的資料庫。 為了讓 IntelliSense 資料庫與程式代碼保持同步,Visual Studio 會自動啟動僅限 IntelliSense 的組建作為背景工作,以響應專案設定或來源檔案中所做的特定變更。
不過,在某些情況下,Visual Studio 可能不會及時更新 IntelliSense 資料庫。 例如,當你執行 git pull or git checkout 指令時,Visual Studio 可能需要長達一小時才能偵測檔案變更。 您可以在方案總管 中,以滑鼠右鍵按兩下專案 節點,然後選擇 [重新掃描方案],以強制重新掃描方案中的所有檔案。
排除 IntelliSense 建置失敗的問題
IntelliSense 的建置不會產生二進位,但它仍然有可能失敗。 失敗的一個可能原因是自訂 .props 或 .targets 檔案。 在 Visual Studio 2017 15.6 版及更高版本中,僅限 IntelliSense 的建置錯誤會被記錄到 [輸出] 視窗。 要查看它們,請將顯示輸出設為解決方案:
錯誤訊息可能會指示您啟用設計時間追蹤:
error: Designtime build failed for project 'E:\src\MyProject\MyProject.vcxproj',
configuration 'Debug|x64'. IntelliSense might be unavailable.
Set environment variable TRACEDESIGNTIME=true and restart
Visual Studio to investigate.
如果你把環境變數 TRACEDESIGNTIME 設為 true,然後重新啟動 Visual Studio,你會看到目錄裡 %TEMP% 有一個日誌檔,這可能有助於診斷建置失敗。
想了解更多環境變數, TRACEDESIGNTIME 請參閱 Roslyn 與 設計時建置。 這些文章中的資訊與C++項目有關。