在VS Code中建置C/C++環境

Dante Chen
14 min readSep 23, 2021

最近公司人手不夠要我幫忙去寫wafer的腳位程式,這些程式幾乎都要用C去寫,沒有寫過 C 的我頓時備感壓力便開始著手看一下怎麼建置 C 的環境,得到的結論大致上有兩個:

• 使用 Visual Studio 2017 up 版本

• 使用 VS Code 或其他 C/C++ 編譯器

選擇第一個選項的話是最快速的也最方便的,因為只要安裝完畢之後大部分的環境設定都會在安裝時就設定好,而且現在Visual studio系列都支援C/C++可以共用,就連 Test 這些都可以直接開一個專案來完成,所以這一篇不會花太多時間介紹 Visual Studio系列的設定(這邊要說明個人安裝的是Visual Studio 2017,主要是公司授權軟體為主).

使用 Visual Studio 2017 建置C/C++專案

  1. 開啟 VS 2017 並點選 -> 新增專案 -> 建立新專案
Visual Studio 2017 畫面 -- 專案建立

2. 左邊選擇 Visual C++ 右邊選擇 空白專案並輸入專案名稱

Visual Studio 2017 畫面 -- 空白專案

完成後會看到以下畫面,請點選右邊欄位的 來源檔案 並按右鍵選擇 加入 -> 新增項目 -> C++檔(.cpp)

Visual Studio 2017 畫面 — 新增項目
Visual Studio 2017 畫面 — 新增項目

3. 如果是 C 語言的話請將檔案名稱改為 .c 並將以下程式加入到 Source.c

(PS: 不改也可以,因為Visual studio裡.cpp也可以跑C)

Visual Studio 2017 畫面 — 方案總管
#include<stdio.h>
#include<stdlib.h>
void main()
{
printf("Hello World from VS 2017\n");
system(“pause”);
}

4. 執行建置與偵錯(F5 or Ctrl F5)

Visual Studio 2017 畫面 — 執行結果

如果看到上述畫面則表示已經成功建置一個 C 專案並可以成功執行,接下來我們來進行VS Code的建置

使用 VS Code 建置 C\C++ 專案

如果要使用VS Code來建置專案則需要先進行較多的環境建置

  1. 安裝 VS Code
  2. 下載mingw64 (GCC/G++),下載完後請解壓縮放在指定位置(這裡是放在C:\下)
  3. mingw64\bin mingw64\include 加入環境變數設定
系統內容畫面 — 系統內容

打開環境變數找到Path行位進行編輯,將 C:\mingw64\bin 和 C:\mingw64\include 加入欄位中

系統內容畫面 — 環境變數
系統內容畫面 — 編輯環境變數

完成後打開 cmd 執行 gcc -v -E -x c++ - 若看到以下畫面則表示設定成功

cmd畫面 — gcc安裝驗證畫面

4. 建立專案和 json檔

開啟 VS Code 並建立一個專案(這裡叫helloworld),進去後同時按下Ctrl+Shift+p 點選 C\C++: Edit Configurations(UI) 進入 IntelliSense 組態

確認 IntelliSense 組態 裡的編輯器路徑為C:\mingw64\bin\g++.exe 或 C:\mingw64\bin\gcc.exe

確定完後會看到左邊的folder欄位會出現.vscode的folder裡面會有c_cpp_properties.json 檔,可確認裡面的內容是否如下:

c_cpp_properties.json 內容
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.18362.0",
"compilerPath": "C:\\mingw64\\bin\\gcc.exe",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "gcc-x64"
}
],
"version": 4
}

之後在.vscode裡加入以下檔案 launch.json, settings.json, tasks.json 並將以下內容貼入:

{
"version": "0.2.0",
"configurations": [{
"name": "(gdb) Launch", // 設定名稱,將會在啟動設定的下拉式選單中顯示
"type": "cppdbg", // 設定型別,cppdbg對應cpptools提供的偵錯功能;可以認為此處只能是cppdbg
"request": "launch", // 請求設定型別,可以為launch(啟動)或attach(附加)
"program": "${fileDirname}/${fileBasenameNoExtension}.exe", // 將要進行偵錯的程式的路徑
"args": [], // 程式偵錯時傳遞給程式的命令列引數,一般設為空即可
"stopAtEntry": false, // 設為true時程式將暫停在程式入口處,相當於在main上打斷點
"cwd": "${workspaceFolder}", // 偵錯程式時的工作目錄,此為工作區資料夾;改成${fileDirname}可變為檔案所在目錄
"environment": [], // 環境變數
"externalConsole": true, // 使用單獨的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": "Compile" // 偵錯對談開始前執行的任務,一般為編譯程式。與tasks.json的label相對應
}]
}
launch.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 -std=c11 -fexec-charset=GBK && &'./$fileNameWithoutExt.exe'",
"cpp": "g++ '$fileName' -o '$fileNameWithoutExt.exe' -Wall -O2 -m64 -static-libgcc -std=c++14 -fexec-charset=GBK && &'./$fileNameWithoutExt.exe'"
// "c": "gcc $fileName -o $fileNameWithoutExt.exe -Wall -O2 -m64 -lm -static-libgcc -std=c11 -fexec-charset=GBK && $dir$fileNameWithoutExt.exe",
// "cpp": "g++ $fileName -o $fileNameWithoutExt.exe -Wall -O2 -m64 -static-libgcc -std=c++14 -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的順序(按字母排序)
}
settings.json 內容
{
"version": "2.0.0",
"tasks": [{
"label": "Compile", // 任務名稱,與launch.json的preLaunchTask相對應
"command": "gcc", // 要使用的編譯器,C++用g++
"args": [
"${file}",
"-o", // 指定輸出檔名,不加該引數則預設輸出a.exe,Linux下預設a.out
"${fileDirname}/${fileBasenameNoExtension}.exe",
"-g", // 生成和偵錯有關的資訊
"-m64", // 不知為何有時會生成16位元應用而無法執行,加上此條可強制生成64位元的
"-Wall", // 開啟額外警告
"-static-libgcc", // 靜態連結libgcc,一般都會加上
"-fexec-charset=GBK", // 生成的程式使用GBK編碼,不加這條會導致Win下輸出中文亂碼;繁體系統改成BIG5
// "-std=c11", // 要用的語言標準,根據自己的需要修改。c++可用c++14
], // 編譯的命令,其實相當於VSC幫你在終端中輸了這些東西
"type": "process", // process是把預定義變數和跳脫解析後直接全部傳給command;shell相當於先開啟shell再輸入命令,所以args還會經過shell再解析一遍
"group": {
"kind": "build",
"isDefault": true // 不為true時ctrl shift B就要手動選擇了
},
"presentation": {
"echo": true,
"reveal": "always", // 執行任務時是否跳轉到終端面板,可以為always,silent,never。具體參見VSC的檔案
"focus": false, // 設為true後可以使執行task時焦點聚集在終端,但對編譯C/C++來說,設為true沒有意義
"panel": "shared" // 不同的檔案的編譯資訊共用一個終端面板
},
"problemMatcher":"$gcc" // 捕捉編譯時終端裡的報錯資訊到問題面板中,修改程式碼後需要重新編譯才會再次觸發
// 本來有Lint,再開problemMatcher就有雙重報錯,但MinGW的Lint效果實在太差了;用Clang可以註釋掉
}]
}
tasks.json 內容

5. 新增helloworld.c file 並將以下內容加入後執行

helloworld.c 內容

編輯完成後儲存並點選右上角畫面的進行標誌(三角形)便可以執行程式

執行後,若沒有出現Error訊息便會看到下圖內容,便表示成功

小結

到目前為止比較 Visual Studio 2017(2019)和 Vs Code 來撰寫 C \C++,感覺是使用 Visual Studio 2017(2019) 會比較方便一點,雖然筆者現在幾乎是用VS Code 來進行開發居多,但考量對應的程式所需要的開發平台還是選擇較方便或契合性較高的Visual Studio 2017(2019)環境會比較好。

Reference

  1. VS Code C語言開發環境配置
  2. VSCode編寫執行C、C++ 程式的方法
  3. 用 VSCode 寫 C/C++ 教學

--

--

Dante Chen

Take the adventure. Nothing worth more than experience.