1. 程式人生 > >VSCode下C++環境的配置

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

官網下載 選擇tdm64-gcc(64位系統)

下載完畢後保證其資料夾下的bin檔案在系統環境變數下,以方便異地呼叫,如下圖

img

對環境變數的設定有問題的可以百度

如果有對編譯效率的追求,可以使用clang編譯器,(即LLVM的環境) 但是Clang沒有標頭檔案,需要額外去加上,具體我沒有去研究,所以這裡直接使用了tdm-gcc

還要指出的是,VSCode不適合做專案,只適合平常的語法、演算法練習。所以編譯效率不是這麼的重要了

如果需要做專案還是推薦Visual Studio啦

外掛

微軟官網有一款外掛C/C++ ,我們的配置是基於這個外掛的

img

支援對C/C++ 的IntelliSence,debugging,code browsing

下面是官方對IntelliSence的簡短介紹

img

基於變數型別,函式定義和匯入模組的智慧完成

為了提升效率,我還使用了下面的外掛

img

img

當然這兩個可以不必選擇,或者說還有其他許多外掛,自行選擇,怎麼順手怎麼來

配置引數

主要有四個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"
    },
}

執行和除錯

img

執行

以下面程式為例

img

press ctrl+F5 直接編譯並執行程式(記得程式末尾加system pause)

win的這個輸出終端視窗採用的編碼是GDK的

img

除錯

還以下面程式為例,安排3個斷點,pressF5 開始除錯 程式會停止在第一個斷點

img

press F10單步跳過 F11單步除錯(會進入函式內部)

img

左側可以看到Locals和設定監視

img

除錯控制檯中可以看到相關的資訊

至此完成了基本的執行和除錯

後記

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,很有用