VSCode下C++環境的配置
前言
VSCode是微軟開發的一款免費的跨平臺的編輯器。其擁有較好的效能和前端視覺,並且支援Debugging、Git、IntelliSense、和各種extensions。
本文介紹的是windows系統下VSCode C++環境的配置,包括執行和除錯。
我的系統版本號是10.0.16299.192 VSCode版本號為1.20.1
編譯器
可以選擇LLVM、MinGW32、MinGW64、Tdm-gcc等主流編譯環境的其中一個。其中LLVM前端(詞法、語法分析、語義分析、生成中間程式碼)使用的是clang,效率上優於後面三個所使用的gcc。
我下面使用的是tdm-gcc
下載完畢後保證其資料夾下的bin檔案在系統環境變數下,以方便異地呼叫,如下圖
對環境變數的設定有問題的可以百度
如果有對編譯效率的追求,可以使用clang編譯器,(即LLVM的環境) 但是Clang沒有標頭檔案,需要額外去加上,具體我沒有去研究,所以這裡直接使用了tdm-gcc
還要指出的是,VSCode不適合做專案,只適合平常的語法、演算法練習。所以編譯效率不是這麼的重要了
如果需要做專案還是推薦Visual Studio啦
外掛
微軟官網有一款外掛C/C++ ,我們的配置是基於這個外掛的
支援對C/C++ 的IntelliSence,debugging,code browsing
下面是官方對IntelliSence的簡短介紹
基於變數型別,函式定義和匯入模組的智慧完成
為了提升效率,我還使用了下面的外掛
當然這兩個可以不必選擇,或者說還有其他許多外掛,自行選擇,怎麼順手怎麼來
配置引數
主要有四個json檔案,在.vscode檔案下
其中launch.json和tasks.json是必要的,更改需謹慎
c_cpp_properties.json和settings.json進行一些習慣的設定,可自由更改
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name ": "C++ Launch (GDB)", // 配置名稱,將會在啟動配置的下拉選單中顯示
"type": "cppdbg", // 配置型別,這裡只能為cppdbg
"request": "launch", // 請求配置型別,可以為launch(啟動)或attach(附加)
"targetArchitecture": "x64", // 生成目標架構,一般為x86或x64
"program": "${fileDirname}/${fileBasenameNoExtension}.exe", // 將要進行除錯的程式的路徑
"args": [], // 程式除錯時傳遞給程式的命令列引數,一般設為空即可
"stopAtEntry": false, // 設為true時程式將暫停在程式入口處,一般設定為false
"cwd": "${workspaceRoot}", // 除錯程式時的工作目錄,一般為${workspaceRoot}
"externalConsole": true, // 除錯時是否顯示控制檯視窗,一般設定為true顯示控制檯
"internalConsoleOptions": "neverOpen", // 如果不設為neverOpen,除錯時會跳到“除錯控制檯”選項卡",
"MIMode": "gdb", // 指定連線的偵錯程式
"miDebuggerPath": "C:/TDM-GCC-64/bin/gdb64.exe", // 偵錯程式路徑
"setupCommands": [
{
"description": "Enable pretty-printing for GDB",
"text": "-enable-pretty-printing",
"ignoreFailures": false
}
],
"preLaunchTask": "Compile"
}
]
}
tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "Compile",
"command": "g++",
"args": [
"-g ${file}", //指定編譯原始碼檔案
"-o ${fileDirname}/${fileBasenameNoExtension}.exe", // 指定輸出檔名,不加該引數則預設輸出a.exe
"-ggdb3", // 生成和除錯有關的資訊
"-Wall", // 開啟額外警告
"-static-libgcc", // 靜態連結
"-std=c++17", // 使用最新的c++17標準
"-Wno-format",
"-finput-charset=UTF-8",//輸入編譯器文字編碼 預設為UTF-8
"-fexec-charset=GBK"//編譯器輸出文字編碼 自行選擇
],
"type": "shell",
"group": {
"kind": "build",
"isDefault": true
},
"presentation": {
"echo": true,
"reveal": "always", // 在“終端”中顯示編譯資訊的策略,可以為always,silent,never
"focus": false,
"panel": "shared" // 不同的檔案的編譯資訊共享一個終端面板
},
"problemMatcher": {
"owner": "cpp",
"fileLocation": [
"relative", "\\"
],
"pattern": {
"regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
"file": 1,
"line": 2,
"column": 3,
"severity": 4,
"message": 5
}
}
}
]
}
c_cpp_properties.json
{
"configurations": [
{
"name": "Win32",
"intelliSenseMode": "clang-x64",
"includePath": [
"${workspaceFolder}",
"C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++",
"C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/x86_64-w64-mingw32",
"C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/backward",
"C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include",
"C:/TDM-GCC-64/x86_64-w64-mingw32/include",
"C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include-fixed"
],
"defines": [
"_DEBUG",
"UNICODE",
"__GNUC__=7",
"__cdecl=__attribute__((__cdecl__))"
],
"browse": {
"path": [
"${workspaceFolder}",
"C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++",
"C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/x86_64-w64-mingw32",
"C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/backward",
"C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include",
"C:/TDM-GCC-64/x86_64-w64-mingw32/include",
"C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include-fixed"
]
},
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
],
"version": 3
}
settings.json
{
"window.zoomLevel": 1,
"editor.snippetSuggestions": "top",
"editor.minimap.renderCharacters": false,
"editor.formatOnPaste": true,
"editor.formatOnType": true,
"editor.wordWrap": "on",
"C_Cpp.clang_format_sortIncludes": true,
"[cpp]": {
"editor.quickSuggestions": true
},
"[c]": {
"editor.quickSuggestions": true
},
"problems.decorations.enabled": true,
"C_Cpp.intelliSenseEngineFallback": "Enabled",
"files.associations": {
"*.cfg": "ini",
"*.fsh": "glsl",
"stack": "cpp",
"iostream": "cpp",
"ostream": "cpp",
"*.tcc": "cpp",
"cctype": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"exception": "cpp",
"initializer_list": "cpp",
"iosfwd": "cpp",
"istream": "cpp",
"limits": "cpp",
"new": "cpp",
"stdexcept": "cpp",
"streambuf": "cpp",
"system_error": "cpp",
"type_traits": "cpp",
"typeinfo": "cpp",
"utility": "cpp"
},
}
執行和除錯
執行
以下面程式為例
press ctrl+F5
直接編譯並執行程式(記得程式末尾加system pause)
win的這個輸出終端視窗採用的編碼是GDK的
除錯
還以下面程式為例,安排3個斷點,pressF5
開始除錯 程式會停止在第一個斷點
press F10
單步跳過 F11
單步除錯(會進入函式內部)
左側可以看到Locals和設定監視
除錯控制檯中可以看到相關的資訊
至此完成了基本的執行和除錯
後記
Debug小結
press ctrl+F5
直接編譯並執行程式
pressF5
開始除錯(如設定了斷點則會停在斷點處,如沒設定,則會直接退出除錯)
press F10
單步跳過 F11
單步除錯(會進入函式內部)
關於編碼
我的VSCode預設編碼是UTF-8 因此我在VSCode裡新建編輯的檔案將會以這種編碼方式將資訊儲存
但各式各樣的檔案,編碼形式太多了,VSCode帶有自動檢測編碼功能(但有時候檢測不準確)
上面tasks.json
檔案中,建議採用
“-finput-charset=UTF-8” //輸入編譯器文字編碼 預設為UTF-8
“-fexec-charset=GBK” //編譯後的輸出格式
這樣在輸出終端中可以正常顯示
如果要寫到檔案中,注意下編輯器的編碼格式就行
另外,windows自家的記事本預設採用的是UTF-8 withbom
格式進行編碼的 建議採用UTF-8 withoutbom
的編輯器進行日常編輯,更為主流些吧。
錯誤
以上配置引數難免有不妥之處,歡迎實踐後的朋友進行交流//在下面評論區留言
參考
上面的網址是微軟官方的docs,很有用