准備工作
1.安裝MinGW64並配置環境變量,如C:\Program Files\mingw64\bin。
2.在VSCode中選擇並安裝C/C++ Extension Pack插件。
3.在鍵盤快捷方式中將任務: 運行測試任務鍵綁定為F4
配置json文件
1.在合適位置創建一個存放源文件和程序的文件夾。
2.在文件夾內創建一個名為.vscode的文件夾和一個名為bin的文件夾(用於存放生成的exe文件)。
3.在.vscode文件夾內創建三個json文件,分別是launch.json, tasks.json, settings.json。在三個文件中輸入以下內容:
launch.json
{ "version": "0.2.0", "configurations": [{ "name": "(gdb)Launch", // 配置名稱,將會在啟動配置的下拉菜單中顯示 "type": "cppdbg", // 配置類型,對於C/C++可認為此處只能是cppdbg,由cpptools提供;不同編程語言不同 "request": "launch", // 可以為launch(啟動)或attach(附加) "program": "${fileDirname}/bin/${fileBasenameNoExtension}.exe", // 將要進行調試的程序的路徑 "args": [], // 程序調試時傳遞給程序的命令行參數,一般設為空 "stopAtEntry": false, // 設為true時程序將暫停在程序入口處,相當於在main上打斷點 "cwd": "${workspaceFolder}", // 調試程序時的工作目錄,此為工作區文件夾;改成${fileDirname}可變為文件所在目錄 "environment": [], // 環境變量 "externalConsole": false, // 使用單獨的cmd窗口,與其它IDE一致;為false時使用內置終端 "internalConsoleOptions": "neverOpen", // 如果不設為neverOpen,調試時會跳到“調試控制台”選項卡,你應該不需要對gdb手動輸命令吧? "MIMode": "gdb", // 指定連接的調試器,可以為gdb或lldb。但我沒試過lldb "miDebuggerPath": "gdb.exe", // 調試器路徑,Windows下后綴不能省略,Linux下則不要 "setupCommands": [ { // 模板自帶,好像可以更好地顯示STL容器的內容,具體作用自行Google "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": false } ], "preLaunchTask": "build" // 調試前執行的任務,一般為編譯程序。與tasks.json的label相對應 }] }
tasks.json
{ "version": "2.0.0", "tasks": [ { // 這個大括號里是‘構建(build)’任務 "label": "build", // 任務名稱,與launch.json的preLaunchTask相對應 "command": "gcc", // 要使用的編譯器,C++用g++ "args": [ "${file}", // 指定要編譯的是當前文件 "-o", // 指定輸出文件名,不加該參數則默認輸出a.exe,Linux下默認a.out "${fileDirname}/bin/${fileBasenameNoExtension}.exe", "-g", // 生成和調試有關的信息 "-m64", // 不知為何有時會生成16位程序而無法運行,此條可強制生成64位的 "-Wall", // 開啟額外警告 "-static-libgcc", // 靜態鏈接libgcc,一般都會加上 "-fexec-charset=GBK", // 生成的程序使用GBK編碼,不加這條會導致Win下輸出中文亂碼;繁體系統改成BIG5 "-std=c11", // 語言標准,可根據自己的需要進行修改,寫c++要換成c++的語言標准,比如c++11 "-D__USE_MINGW_ANSI_STDIO" // 用MinGW寫C時留着,否則不需要,用於支持printf的%zd和%Lf等 ], // 編譯的命令,其實相當於VSC幫你在終端中輸了這些東西 "type": "process", // process是把預定義變量和轉義解析后直接全部傳給command;shell相當於先打開shell再輸入命令,所以args還會經過shell再解析一遍 "group": { // 表示‘組’,我們可以有很多的task,然后把他們放在一個‘組’里 "kind": "build", "isDefault": true // 不為true時ctrl shift B就要手動選擇了 }, "presentation": { "echo": true, // 表示在執行任務時在終端要有輸出 "reveal": "always", // 執行任務時是否跳轉到終端面板,可以為always,silent,never。具體參見VSC的文檔,即使設為never,手動點進去還是可以看到 "focus": false, // 設為true后可以使執行task時焦點聚集在終端,但對編譯C/C++來說,設為true沒有意義 "panel": "shared" // 不同的文件的編譯信息共享一個終端面板 }, "problemMatcher": "$gcc" // 捕捉編譯時終端里的報錯信息到問題面板中,修改代碼后需要重新編譯才會再次觸發 // 本來有Lint,再開problemMatcher就有雙重報錯,但MinGW的Lint效果實在太差了;用Clangd可以注釋掉 }, { // 這個大括號里是‘運行(run)’任務,一些設置與上面的構建任務性質相同 "label": "run", "type": "shell", "dependsOn": "build", // 任務依賴,因為要運行必須先構建,所以執行這個任務前必須先執行build任務, "command": "${fileDirname}/bin/${fileBasenameNoExtension}.exe", // 執行exe文件,只需要指定這個exe文件在哪里就好 "group": { "kind": "test", // 這一組是‘測試’組,將run任務放在test組里方便我們用快捷鍵執行 "isDefault": true }, "presentation": { "echo": true, "reveal": "always", "focus": true, // 這個就設置為true了,運行任務后將焦點聚集到終端,方便進行輸入 "panel": "shared" } } ] }
settings.json
{ "files.defaultLanguage": "c", // ctrl+N新建文件后默認的語言 "editor.formatOnType": true, // 輸入分號(C/C++的語句結束標識)后自動格式化當前這一行的代碼 "editor.suggest.snippetsPreventQuickSuggestions": false, // clangd的snippets有很多的跳轉點,不用這個就必須手動觸發Intellisense了 "editor.acceptSuggestionOnEnter": "off", // 我個人的習慣,按回車時一定是真正的換行,只有tab才會接受Intellisense // "editor.snippetSuggestions": "top", // (可選)snippets顯示在補全列表頂端,默認是inline "code-runner.runInTerminal": true, // 設置成false會在“輸出”中輸出,無法輸入 "code-runner.executorMap": { "c": "gcc '$fileName' -o '$fileNameWithoutExt.exe' -Wall -O2 -m64 -lm -static-libgcc -fexec-charset=GBK -D__USE_MINGW_ANSI_STDIO && &'./$fileNameWithoutExt.exe'", "cpp": "g++ '$fileName' -o '$fileNameWithoutExt.exe' -Wall -O2 -m64 -static-libgcc -fexec-charset=GBK && &'./$fileNameWithoutExt.exe'" // "c": "gcc $fileName -o $fileNameWithoutExt.exe -Wall -O2 -m64 -lm -static-libgcc -fexec-charset=GBK -D__USE_MINGW_ANSI_STDIO && $dir$fileNameWithoutExt.exe", // "cpp": "g++ $fileName -o $fileNameWithoutExt.exe -Wall -O2 -m64 -static-libgcc -fexec-charset=GBK && $dir$fileNameWithoutExt.exe" }, // 右鍵run code時運行的命令;未注釋的僅適用於PowerShell(Win10默認)和pwsh,文件名中有空格也可以編譯運行;注釋掉的適用於cmd(win7默認)、PS和bash,但文件名中有空格時無法運行 "code-runner.saveFileBeforeRun": true, // run code前保存 "code-runner.preserveFocus": true, // 若為false,run code后光標會聚焦到終端上。如果需要頻繁輸入數據可設為false "code-runner.clearPreviousOutput": false, // 每次run code前清空屬於code runner的終端消息,默認false "code-runner.ignoreSelection": true, // 默認為false,效果是鼠標選中一塊代碼后可以單獨執行,但C是編譯型語言,不適合這樣用 "code-runner.fileDirectoryAsCwd": true, // 將code runner終端的工作目錄切換到文件目錄再運行,對依賴cwd的程序產生影響;如果為false,executorMap要加cd $dir "C_Cpp.clang_format_sortIncludes": true // 格式化時調整include的順序(按字母排序) }
調試運行
1.編寫完成后按F4進入Release模式。
2.按F5進入Debug模式。
多個源文件的編譯
1.安裝Code Runner插件。
2.在設置中搜索code runner,選擇 Executor Map 在 settings.json 中編輯。
3.修改其中的gcc $filename為gcc *.c;g++同理。
4.點擊Run Code可直接編譯運行。