Microsoft C / C ++擴展提供了對Visual Studio Code的C / C ++支持,以便在Windows,Linux和macOS上使用VS Code實現跨平臺C和C ++開發。該擴展仍處於預覽階段,咱們關注的是VS代碼運行的全部C和C ++代碼的代碼編輯,導航和調試支持。html
若是您只想要一個輕量級工具來編輯C ++文件,Visual Studio Code是一個很好的選擇,但若是您但願得到現有Visual C ++項目的最佳體驗或在Windows上進行調試,咱們建議您使用Visual Studio IDE的一個版本例如Visual Studio社區。java
若是您遇到任何問題或有關於Microsoft C / C ++擴展的建議,請在GitHub上提交問題和建議。若是您還沒有提供反饋,請參加此快速調查,以幫助您根據須要制定此擴展程序。linux
入門
要安裝Microsoft C / C ++擴展,請執行如下操做:c++
- 打開VS代碼。
- 單擊補充工具欄上的「擴展視圖」圖標。
- 搜索
c++
。 - 單擊「 安裝」,而後單擊「 從新加載」。
安裝C / C ++擴展後,打開包含C / C ++源代碼的文件夾。VS Code會將各類設置文件放入.vscode
子文件夾中。git
注意:C / C ++擴展不包括C ++編譯器或調試器。您須要安裝這些工具或使用計算機上已安裝的工具。流行的C ++編譯器是用於Windows的mingw-w64,用於macOS的XCode的 Clang 和用於Linux的GCC。確保您的編譯器可執行文件位於您的平臺路徑中,以便擴展程序能夠找到它。該擴展還支持Windows的Windows子系統。github
配置IntelliSense
擴展程序將嘗試根據您在系統上找到的編譯器肯定文件夾的基本配置信息。若是因爲任何緣由,該配置不完整,您能夠c_cpp_properties.json
經過從命令選項板運行C / Cpp:Edit configurations ...命令生成文件(⇧⌘P並添加缺乏的信息。算法
若是#include
找不到文件或其中一個依賴項,您還能夠單擊include語句下的綠色曲線來查看有關如何更新配置的建議。shell
這將生成一個c_cpp_properties.json
文件,容許您添加其餘路徑並定義以正確啓用代碼導航和自動完成。數據庫
下面您能夠看到MinGW C ++編譯器已被設置爲Windows的默認編譯器。擴展將使用該信息來肯定系統包含路徑和定義,以便不須要添加它們c_cpp_properties.json
。編程
{
"name": "Win32", "includePath": [ "${workspaceFolder}" ], "defines": [ "_DEBUG", "UNICODE" ], "compilerPath": "C:\\mingw-w64\\bin\\gcc.exe", "intelliSenseMode": "clang-x64", "browse": { "path": [ "${workspaceFolder}" ], "limitSymbolsToIncludedHeaders": true, "databaseFilename": "" } }
構建代碼
若是要從VS Code構建應用程序,則須要生成一個tasks.json
文件:
- 打開命令選項板(⇧⌘P)。
- 選擇Tasks:Configure Tasks ...命令,單擊模板中的Create tasks.json文件,您將看到任務運行器模板列表。
- 選擇Others以建立運行外部命令的任務。
- 更改成
command
用於構建應用程序的命令行表達式(例如g++
)。 - 添加任何須需的args(例如
-g
構建用於調試)。 - 您還能夠將其更改
label
爲更具描述性。
您如今應該tasks.json
在工做區.vscode
文件夾中看到一個相似於如下內容的文件:
{
"version": "2.0.0", "tasks": [ { "label": "build hello world", "type": "shell", "command": "g++", "args": [ "-g", "helloworld.cpp" ] } ] }
若是您但願可以使用「 任務:運行構建任務」(⇧⌘B)構建應用程序,則能夠將其添加到build
組中。
{
"version": "2.0.0", "tasks": [ { "label": "build hello world", "type": "shell", "command": "g++", "args": [ "-g", "helloworld.cpp" ], "group": { "kind": "build", "isDefault": true } } ] }
有關任務的更多信息,請參閱經過任務與外部工具集成。
調試代碼
要啓用調試,您須要生成一個launch.json
文件:
- 單擊補充工具欄中的「調試」圖標,導航到「調試」視圖。
- 在「 調試」視圖中,單擊「 配置」圖標。
- 從「 選擇環境」下拉列表中選擇
C++ (GDB/LLDB)
(以使用GDB或LLDB)或C++ (Windows)
(以使用Visual Studio Windows調試程序)。這將使用兩種配置建立一個用於編輯的文件:launch.json
- C ++ Launch定義了在開始調試時啓動應用程序的屬性。
- C ++ Attach定義了附加到已經運行的進程的屬性。
program
使用您正在調試的程序的路徑更新該屬性。- 若是您但願在開始調試時構建應用程序,請添加一個
preLaunchTask
屬性,其中包含您在其中建立的構建任務的名稱tasks.json
(上例中的「構建hello world」)。
下面是使用MinGW GDB調試器的示例:
{
"version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/a.exe", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, "MIMode": "gdb", "miDebuggerPath": "C:\\mingw\\bin\\gdb.exe", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "build hello world" } ] }
要了解更多信息,請參閱配置launch.json以進行C / C ++調試。
若是在Windows上使用GDB進行調試,請參閱使用GDB進行Windows調試。
編輯代碼
代碼格式
Visual Studio Code的C / C ++擴展支持使用擴展名附帶的clang格式進行源代碼格式化。
您可使用格式文檔(⇧⌥F)格式化整個文件,也可使用右鍵單擊上下文菜單中的格式選擇(⌘K⌘F)格式化當前選擇。您還可使用如下設置配置自動格式化:
editor.formatOnSave
- 保存文件時格式化。editor.formatOnType
- 在鍵入時格式化(在;字符上觸發)。
默認狀況下,clang格式樣式設置爲「file」,這意味着它會.clang-format
在工做區內查找文件。若是.clang-format
找到該文件,則根據文件中指定的設置應用格式。若是.clang-format
工做區中未找到任何文件,則會根據C_Cpp.clang_format_fallbackStyle
設置中指定的默認樣式應用格式設置。目前,默認格式樣式是「Visual Studio」,它是Visual Studio中默認代碼格式化程序的近似值。
「Visual Studio」clang格式樣式還不是官方的OOTB clang格式樣式,但它暗示瞭如下clang格式設置:
UseTab: (VS Code current setting)
IndentWidth: (VS Code current setting)
BreakBeforeBraces: AllMan
AllowShortIfStatementsOnASingleLine: false IndentCaseLabels: false ColumnLimit: 0
若是您要使用與擴展名附帶的格式不一樣的clang格式版本,則可使用該C_Cpp.clang_format_path
設置並將其值設置爲安裝clang格式二進制文件的路徑。
例如,在Windows平臺上:
"C_Cpp.clang_format_path": "C:\\Program Files (x86)\\LLVM\\bin\\clang-format.exe"
自動完成
自動完成由與Visual Studio相同的引擎提供支持。當您的工做區配置了全部必需的包含路徑和定義時,您將得到最相關的建議(請參閱上面的「配置IntelliSense」部分)。
導航代碼
C / C ++擴展提供的源代碼導航功能是理解和繞過代碼庫的強大工具。這些功能由存儲在符號信息的離線數據庫中的標籤提供支持。安裝了C / C ++擴展後,只要將包含C ++源代碼文件的文件夾加載到VS代碼中,就會生成此數據庫。當標記解析器生成此信息時,數據庫圖標將顯示在活動配置名稱旁邊(下圖中的「Win32」)。
當圖標消失時,源代碼符號已在脫機數據庫中標記。
指定其餘包含目錄以得到更好的符號支持
爲了提供最佳體驗,VS Code的C / C ++擴展須要知道它在哪裏能夠找到代碼中引用的每一個頭文件。默認狀況下,擴展名搜索當前源目錄,其子目錄和某些特定於平臺的位置。若是找不到引用的頭文件,VS Code會在引用它的每一個#include指令下面顯示綠色波形。
要指定要搜索的其餘包含目錄,請將光標放在顯示綠色波浪線的任何#include指令上,而後在出現時單擊燈泡操做。這將打開文件c_cpp_properties.json
進行編輯; 在這裏,您能夠經過向「browse.path」屬性添加更多目錄來單獨爲每一個平臺配置指定其餘包含目錄。
搜索符號
您能夠在當前文件或工做區中搜索符號,以便更快地導航代碼。
要在當前文件中搜索符號,請按⇧⌘O,而後輸入您要查找的符號的名稱。將顯示潛在匹配列表,並在您鍵入時進行過濾。從匹配列表中選擇以導航到其位置。
要在當前工做空間中搜索符號,請按⌘T,而後輸入符號的名稱。潛在匹配列表將如前所示。若是您選擇的文件還沒有打開,則會在導航到匹配位置以前打開該文件。
或者,若是您願意,能夠經過命令選項板訪問這些命令來搜索符號。使用快速打開(⌘P)而後輸入'@'命令搜索當前文件,或輸入'#'命令搜索當前工做區。⇧⌘O和⌘T分別只是'@'和'#'命令的快捷方式,因此一切都是同樣的。
窺視定義
您可使用Peek Definition功能快速查看符號的定義方式。此功能在窺視窗口內的定義附近顯示幾行代碼,所以您能夠在不離開當前位置的狀況下查看。
要查看符號的定義,請將光標放在源代碼中使用的任何位置的符號上,而後按⌥F12。或者,您能夠從上下文菜單中選擇Peek Definition(右鍵單擊,而後選擇Peek Definition)。
目前,C / C ++擴展不會以某種方式解析代碼,以幫助它根據符號的使用方式區分競爭定義。當符號在不一樣的上下文中定義不一樣的事物時會出現這些競爭定義,例如在重載函數,類及其構造函數以及其餘狀況下發生。發生這種狀況時,每一個競爭定義都列在窺視窗口的右側,當前選擇的源代碼顯示在左側。
打開窺視窗口,瀏覽競爭定義列表以找到您感興趣的定義。若是要導航到其中一個定義的位置,只需雙擊您感興趣的定義,或者按雙擊查看窗口左側顯示的源代碼中的任意位置。
轉到定義
您還可使用「轉到定義」功能快速導航到定義符號的位置。
要轉到符號的定義,請將光標放在源代碼中使用的符號上,而後按F12。或者,您能夠從上下文菜單中選擇「 轉到定義 」(右鍵單擊,而後選擇「 轉到定義」)。若是隻有一個符號定義,您將直接導航到其位置,不然競爭定義將顯示在上一節中所述的查看窗口中,您必須選擇要轉到的定義。
調試
按照「 入門」中的說明設置調試環境的基礎知識後,您能夠在本節中瞭解有關調試C / C ++的更多詳細信息。
VS Code支持如下C / C ++調試器,具體取決於您使用的操做系統:
- Linux:GDB
- macOS:LLDB或GDB
- Windows:Visual Studio Windows調試器或GDB(使用Cygwin或MinGW)
使用GDB進行Windows調試
您可使用VS Code調試使用Cygwin或MinGW建立的Windows應用程序。要使用Cygwin或MinGW調試功能,必須在啓動配置(launch.json
)中手動設置調試器路徑。要調試Cygwin或MinGW應用程序,請添加該miDebuggerPath
屬性並將其值設置爲Cygwin或MinGW環境的相應gdb.exe的位置。
例如:
"miDebuggerPath": "c:\\mingw\\bin\\gdb.exe"
Windows上的Cygwin / MinGW調試支持附加和啓動調試方案。
條件斷點
條件斷點使您只有在條件的值爲true時才能在特定代碼行上中斷執行。要設置條件斷點,請右鍵單擊現有斷點,而後選擇「 編輯斷點」。這將打開一個小的查看窗口,您能夠在其中輸入必須評估爲true的條件,以便在調試期間命中斷點。
在編輯器中,條件斷點由斷點符號表示,斷點符號內部有一個黑色等號。您能夠將光標放在條件斷點上以顯示其條件。
功能斷點
函數斷點使您可以在函數的開頭而不是在特定的代碼行上中斷執行。要設置函數斷點,請在「 調試」窗格中右鍵單擊「 斷點」部分,而後選擇「 添加函數斷點」並輸入要在其上執行的函數的名稱。
表達評估
VS Code支持在幾種狀況下進行表達式評估:
- 您能夠在「 調試」面板的「 監視」部分中鍵入表達式,並在每次遇到斷點時對其進行評估。
- 您能夠在調試控制檯中鍵入表達式,它只會被評估一次。
- 您能夠在斷點處中止時評估代碼中出現的任何表達式。
請注意,Watch部分中的表達式在正在調試的應用程序中生效; 修改變量值的表達式將在程序的持續時間內修改該變量。
多線程調試
VS Code的C / C ++擴展可以調試多線程程序。全部線程及其調用堆棧都顯示在「 調用堆棧」部分中:
內存轉儲調試
VS Code的C / C ++擴展還具備調試內存轉儲的能力。要調試內存轉儲,請打開launch.json
文件並將coreDumpPath
(對於GDB或LLDB)或dumpPath
(對於Visual Studio Windows調試器)屬性添加到C ++啓動配置,將其值設置爲包含內存轉儲路徑的字符串。這甚至適用於在x64機器上調試的x86程序。
附加符號
若是存在調試器能夠找到符號文件的其餘目錄(例如,.pdb
Visual Studio Windows調試器的文件),則能夠經過添加additionalSOLibSearchPath
(對於GDB或LLDB)或symbolSearchPath
(對於Visual Studio Windows調試器)來指定它們。
例如:
"additionalSOLibSearchPath": "/path/to/symbols;/another/path/to/symbols"
要麼
"symbolSearchPath": "C:\\path\\to\\symbols;C:\\another\\path\\to\\symbols"
找到源文件
若是源文件不在編譯位置,則能夠更改源文件位置。這是經過本sourceFileMap
節中添加的簡單替換對完成的。將使用此列表中的第一個匹配項。
例如:
"sourceFileMap": { "/build/gcc-4.8-fNUjSI/gcc-4.8-4.8.4/build/i686-linux-gnu/libstdc++-v3/include/i686-linux-gnu": "/usr/include/i686-linux-gnu/c++/4.8", "/build/gcc-4.8-fNUjSI/gcc-4.8-4.8.4/build/i686-linux-gnu/libstdc++-v3/include": "/usr/include/c++/4.8" }
GDB,LLDB和MI命令(GDB / LLDB)
對於C++ (GDB/LLDB)
調試環境,您可使用該命令直接經過調試控制檯執行GDB,LLDB和MI命令-exec
,但要當心,直接在調試控制檯中執行命令是未經測試的,而且在某些狀況下可能會致使VS Code崩潰。
其餘調試功能
- 無條件斷點
- 觀察窗口
- 調用堆棧
- 步進
有關使用VS Code進行調試的更多信息,請參閱VS Code中的調試簡介。
已知限制
符號和代碼導航
全部平臺:
- 由於擴展不解析函數體,因此Peek Definition和Go to Definition不適用於函數體內定義的符號。
調試
視窗:
- Cygwin和MinGW上的GDB沒法打破正在運行的進程。要在應用程序運行時設置斷點(未在調試器下中止),或暫停正在調試的應用程序,請在應用程序終端中按Ctrl-C。
- Cygwin上的GDB沒法打開核心轉儲。
Linux的:
- GDB須要提高權限才能附加到進程。使用attach進行處理時,須要在調試會話開始以前提供密碼。
蘋果系統:
- LLDB:
- 使用LLDB進行調試時,若是在中斷模式下關閉終端窗口,則調試不會中止。按「 中止」按鈕能夠中止調試。
- 中止調試時,終端窗口未關閉。
- GDB:
- 須要完成其餘手動安裝步驟才能在macOS上使用GDB。見的OS X GDB的手動安裝的自述。
- 使用GDB附加到進程時,沒法中斷正在調試的應用程序。GDB將僅綁定應用程序未運行時設置的斷點(在鏈接到應用程序以前或應用程序處於中止狀態時)。這是因爲GDB中的一個錯誤。
- 使用GDB進行調試時沒法加載核心轉儲,由於GDB 不支持macOS中使用的核心轉儲格式。
- 當使用GDB附加到進程時,break-all將結束該進程。
下一步
請繼續閱讀以瞭解:
常見問題
問:個人項目不會加載。
答: VS Code目前不支持C ++項目文件,而是將您選擇的目錄視爲項目的工做區。該目錄及其子目錄中的源代碼文件是工做區的一部分。
問:如何構建/運行個人項目?
答: VS Code支持您能夠配置以構建應用程序的任務,而且本機地瞭解MSBuild,CSC和XBuild的輸出。有關更多信息,請參閱任務文檔。
若是您有任何其餘問題或遇到任何問題,請在GitHub上提出問題。