# (新手向)使用VSCode撰寫、編譯並Debug(偵錯)C/C++程式碼 (Windows)
###### *注意時效性(本文撰寫於 2025/4)*
這篇文章是專門for C語言入門新手,或者是在被學校的程式語言用 Dev-C++ 荼毒過後的學生,想轉戰使用美觀、方便的VSCode寫C語言所做的教學。
當然我知道,有些人可能有一些奇怪的開發環境癖好(例如我),所以環境先講清楚,不喜歡直接上一頁避免浪費時間。
本文會使用Msys2安裝Clang Compiler,並且使用LLDB進行Debug。
另外,設定完成後,只會編譯單一檔案,不適用多檔編譯。
請注意,編譯環境for C (最後一節會教學C/C++編譯),作業系統使用Windows 10,理論上來說Windows 11應該不會有差別。
# 教學開始
## 1. 安裝Msys2
首先請至[MSYS2](https://www.msys2.org/)官網下載安裝檔

> 紅框框起來的地方點下去就會直接下載
安裝過程我只提一點:安裝位置請自行抉擇,通常是如下圖預設C:\msys64 但是如果各位有需求需要更改安裝位置可隨意更改(最常見的理由 C槽不夠大,根據教學設定完後會占用2 GB),惟後面教學遇到C:\msys64的部分請修改為各位更改後的安裝路徑。

> 有需要自行將C:\msys64改掉,請注意後面步驟有遇到也要一起改
之後就是下一步點到底,等待安裝完畢。
安裝完畢之後會直接跳出一個終端機,先關閉他。
之後於左下角搜尋Msys2,打開Msys2的終端機

> 於搜尋欄內搜尋msys2
打開後輸入 pacman -Syu
```bash
pacman -Syu
```

> 這行指令的作用是更新Msys2及套件
跑一下子之後會如下圖一樣卡住,直接壓Enter或者輸入y之後壓Enter都可以。

> 個人是直接壓Enter,我懶
之後再跑一陣子又會卡住,直接壓Enter,應該會關閉終端機。

> 最後一行的意思就是說完成更新需要關閉終端機
之後重新開啟終端機,輸入 pacman -S mingw-w64-clang-x86_64-clang
```bash
pacman -S mingw-w64-clang-x86_64-clang
```

> 安裝Clang Compiler
會詢問你要不要安裝,一樣直接壓Enter

> 安裝Clang Compiler時會安裝的依賴套件列表以及Clang本身
那這段安裝時間需要一段時間,取決於網路給不給面子,可以先去泡杯咖啡來喝或者滑個手機。
跑完之後就可以直接把Msys2終端機關掉了。
## 2. 更改PATH環境變數
按下Win+R輸入"rundll32.exe" sysdm.cpl,EditEnvironmentVariables,開啟環境變數設定。如果沒有出現,請將每個視窗一個一個縮小,應該是被其他視窗擋住了。
```bash
"rundll32.exe" sysdm.cpl,EditEnvironmentVariables
```

> 右鍵點擊Windows按鈕選"執行"也可以叫出來
選擇Path,按編輯。

> 上面跟下面的Path都可以
選擇瀏覽,之後選到C:\msys64\clang64\bin,點確定

> 前面有改路徑的同學請記得自己換路徑!
之後就是確定三連即可。如果你的VSCode開著,請將VSCode完全關閉後重開,VSCode才會套用新的環境變數。
*上面這邊是設定路徑的環境變數,方便之後VSCode執行指令。*
> 上面這段主要是在安裝Compiler,VSCode本身只是編輯器,並不具備編譯C語言程式的能力;而我使用Msys2安裝的原因是:方便。大部分的人可能會覺得在那邊打指令打來打去還沒我直接google的快哪裡方便? 只能說以後如果各位要裝一堆雜七雜八且都是for 類Unix系統使用的套件時就會明白Msys2的好了。還有,一鍵更新是真的爽。
## 3. 安裝 VSCode
我希望這個章節可以不用教,畢竟VSCode就是左鍵點到底,但是安裝時有一些小設定我覺得很重要的因此稍微提一下,如果各位已經裝完了就可以跳過了。
一樣先到[VSCode](https://medium.com/r/?url=https%3A%2F%2Fcode.visualstudio.com%2Fdownload)官網下載安裝

> 一樣紅框框起來的地方,點ㄊ下載
安裝到第三頁的時候注意一下,我建議這裡的選項全勾起來。

## 4. 安裝VSCode的延伸模組
安裝完成之後打開VSCode,我們需要安裝一些延伸模組來幫助我們使用VSCode上使用的更順利。
首先點選左邊的延伸模組(Extension)

> 一樣點紅框框
在上面的Search欄位打Chinese,看到那個中文(繁體)的Install按鈕,點他。

> 當然你要裝簡體的或者直接不裝用英文我也不反對
好了之後右下角會問你要不要切換語言,點擊按鈕,VSCode應該會自動關閉後重啟,並且語言變為中文。

> 點擊Change Language and Restart
重新啟動完成之後,點擊左邊的延伸模組,接下來安裝C語言的延伸模組,讓VSCode支持C語言的語法。

> 搜尋C,對C/C++延伸模組點擊安裝
再次搜尋,這次搜尋CodeLLDB,安裝Debugger。

這個Debugger安裝需要一點時間(取決於網路速度)。
到這邊VSCode延伸模組安裝就差不多完成了,接下來便是教學如何用VSCode寫C語言以及編譯、Debug。
## 5. 準備Workspace
要使用VSCode寫程式,我這裡強烈建議,請把每個語言的資料夾都分開,並且一定要開啟一個資料夾作為Workspace,方便管理環境。
首先在桌面(或者你喜歡的任何地方)創建一個資料夾,這個資料夾專門放置C語言檔案。範例如下,我在桌面創建一個資料夾"C"。名稱注意一下,請盡量不要是中文且不要有空白(空白可用底線(_)取代)。

> 位置與名字都隨意,但請盡量不要是中文且不要有空白。
點開資料夾之後,在空白處點右鍵,會看到一個選項"以Code開啟",點他。

> 還記得我們安裝VSCode時勾選的選項嗎? 就是在這裡派上用場了,非常好用!
打開VSCode之後我們就會在這個C資料夾裡了。

> 檔案總管下面的C 就是範例中的C資料夾了
滑鼠移到檔案總管上,可看到資料夾上有浮現選項,左邊為新增檔案,右邊為新增資料夾。

點選新增檔案,並且命名檔案。任意名稱,盡量不要是中文且不要有空白,但是後綴必須是.c

> 這裡命名為lkk1.c,記得一定要.c結尾,VSCode才會識別為C語言檔案
之後我們就可以開始編寫程式了。以下示範為一個簡單的Helloworld程式。

> 各位自己打一遍,就會知道VSCode的方便與強大之處!
好,可是這個時候要怎麼運行? VSCode這個時候還不知道如何編譯與運行你的檔案,因此我們需要寫設定來讓VSCode自動地幫我們編譯與運行。
## 6. 設定VSCode的編譯與運行
接下來我們要設定VSCode,幫我們運行指令。
首先按下F1,輸入con,找到 工作: 設定工作,來設定編譯工作。

### A. 如果你前面的Path環境變數有設定正確,沒有意外的話會跳出clang的編譯工作,直接點選他。
*(沒跳出請跳到[B.](#B-如果你的並沒有跳出clang編譯工作選項,選擇-從範本建立tasksjson檔案,) )*


> 如果要知道tasks.json的內容意義,請自行參閱VSCode官方文檔。
這邊請將label的內容改為build,方便之後的設定。

> 反白處
### B. 如果你的並沒有跳出clang編譯工作選項,選擇 從範本建立tasks.json檔案,

之後選擇Others。

貼上以下內容於"tasks":[ ] 的[ ]內即可。
```json
{
"label": "build",
"type": "shell",
"command": "clang",
"args": [
"-g",
"${file}",
"-o",
"${workspaceFolder}/${fileBasenameNoExtension}.exe"
],
}
```
結果如下圖。

到這邊,編譯工作已經完成,但VSCode到這邊也只會幫你編譯出可執行檔,
此時VSCode只能運行,還不能Debug,因此我們需要再設定Debug設定。
點選左邊的Debug選單,並按下 建立launch.json檔案。

> 建立Debug設定檔
選擇LLDB。

> 不要選到上面兩個選項喔!
點下去之後會跳出一個選單,這邊請直接按ESC就好。

> 如果有跳出這個選單直接按ESC就好
接下來要修改一下這個launch.json檔案。
請將這個<executable file\>換成 {fileBasenameNoExtension}.exe 。
```json
${fileBasenameNoExtension}.exe
```

> 修改前,要修改的地方我有幫你反白

> 修改後,如圖上所示。
之後還要新增一個選項preLaunchTask。
```json
"preLaunchTask": "build"
```

或者你直接copy以下的文字到launch.json檔案也可以,只要長得跟上圖一樣就行。
```json
{
"type": "lldb",
"request": "launch",
"name": "Debug",
"program": "${workspaceFolder}/${fileBasenameNoExtension}.exe",
"args": [],
"cwd": "${workspaceFolder}",
"preLaunchTask": "build"
}
```
好了到這邊我們就結束VSCode的設定了,可以開始嘗試編譯並Debug C語言檔案了。
## 7. 編譯並運行C語言程式
點選左邊的檔案總管,回到我們的C語言檔案。

之後直接按下F5,就可以執行了。

> 等待一段時間後的執行成果
嗯? 阿我們的Hello world!怎麼不見了?
其實是被VSCode給偷偷隱藏起來了! 點選下面的終端機,就可以看到執行結果了。

> 到終端機這裡就可以看到我們的Hello World!
*(可選)* 如果不喜歡VSCode內建的終端機,可以在launch.json再新增一個選項,使用外部的終端機(外部的cmd、powershell等)。
```json
"console": "externalTerminal"
```

好的,到這邊就已經可以開始寫你自己的C語言程式了!
這邊有幾點注意事項提醒各位。
#### A.右上角也有一個選項是 偵錯C/C++檔案 ,我們這邊並沒有設定這邊的參數,因此會無法執行,若要用這邊的選項請自行找網路上的資源來設定。
#### B.按下F5檔案時,當前的視窗開啟的檔案必須要是你要編譯的.c檔!(也就是你畫面上的文字編輯器的內容要是.c檔的內容)
VSCode會根據你視窗開啟的檔案自動識別要編譯的檔案名字,並根據名字產生執行檔並運行偵錯。
編譯環境建置教學到此結束,下面都是額外教學不必要做。A.是在介紹VSCode Debug介面以及功能,如果各位以前沒有使用過Debug建議看一下,可以讓各位以後Debug的時候更有效率。
# 額外介紹/教學
## A. VSCode Debug功能簡單介紹
我們寫一個包含變數與迴圈的程式,來介紹Debug功能。

> 範例程式
於行數的左邊,滑鼠滑上去時可以看到紅色的點,這個點稱為"中斷點",意思是當程式運行到有紅點的那行便會自動暫停。暫停時,VSCode會秀出各個變數的內容!


> 程式暫停時的樣子
於左邊的介面中,"變數"會顯示出Local(局域)變數與其他的全域和Static變數,而紅框中是我滑鼠移到一個變數上,VSCode會有Hover顯示該變數的內容。
中斷點可以自行增減,在程式執行時與暫停時皆可設置,因此可以設置多個中斷點方便觀察程式運行的過程與結果。
而上面的選單也需要介紹,也是很重要的功能。最左邊的叫做"繼續",意思就是讓程式再繼續執行,直到遇到下一個中斷點。例如我將中斷點從第8行改到第13行並按下"繼續",程式就會一直執行直到第13行又再次暫停。

> 取消第8行的中斷點,並在第13行增設中斷點

> 按下"繼續"後程式停在第13行,可看到此時\*並沒有印出
接下來則是右邊的"不進入函式"、"逐步執行"與"跳離函式",要解釋這三個的差異需先撰寫一個函式方便講解。我這邊撰寫另外一個範例程式講解。

> 新的範例程式,含有函式,不會函式請查C語言教學,這裡不贅述
我們將中斷點設置在第12行,並按下"逐步執行",看看會發生什麼事?

> 程式於12行暫停,還未按下"逐步執行"

> 按下逐步執行後,可看到程式跑到了函式內部!
逐步執行,顧名思義就是一步一步往下做,包含函數的內部也會一步一步往下做,當你要查看函數內部的運行狀況(例如傳入函數的數值為何、函數內的執行等),就非常有用!
那我們接下來看"跳離函式"。簡而言之,跳離函式便是讓程式一直執行直到這個函式返回。**請注意,跳離函式的意思並不是直接讓函式在該行直接返回! 而是讓程式一直執行直到函式返回!** 這個在執行一個較大的函式時,若我們要查看的部分只在函式前面,而後面不care的時候,這個時候查看完直接按跳離函式就會非常方便。

> 我們直接在第4行那邊按跳離函式
注意到上圖幾件事情:
#### 1. 我並沒有在12行按中斷點(我將第12行的中斷點取消了),然而在我按下跳離函式後,程式依然是停在第12行。
#### 2. 左邊的Local可看到return value,這邊可以直接讓各位看到函式返回值,相當方便!
最後便是"不進入函式",顧名思義便是直接跳過函式的內部步驟,
當我想focus在main的運行,而不想管函式細節時就會使用這個功能。**一樣請注意,不進入函式並不是跳過這個函式不執行了! 而是將這一行當成一個敘述,直接執行到下一行。**

> 於第12行按下中斷點使程式停在12行

> 程式會直接往下跳下一行。
一樣可以注意到幾件事情:
#### 1. 直接跳到下一行,並沒有在函式內部暫停。
#### 2. 左邊變數的監看可以看到tmp 的6有稍微反白,當你每運行 1行程式,若變數有更動,則有變動的變數VSCode會幫你反白,方便Debug。
## B. 自動排版
剛開始寫程式語言時,可能對於排版無感,例如下面這種。但是,一個良好的排版對於程式碼閱讀是很重要的! 但是你說我手動排版很麻煩啊? 那怎辦? 其實VSCode可以自動幫你排版!

> 這種排版真的會讓人看到非常抓狂
那要如何設定呢? 請按下F1,輸入format,選擇 文件格式化方式...

選擇 設定預設格式器

> 選擇C/C++則是會直接幫你排版
選擇 C/C++

> 按Enter選擇格式器
之後點左下角的齒輪,點設定

在設定上搜尋format,將 Format On Save 打勾

之後回到我們的.c檔,按下Ctrl + S 儲存檔案,此時VSCode就會自動幫我們排版排好了!

> 簡單、省時、美觀又方便
## C. 使用Clangd提示
在本篇 4.安裝延伸模組 時,我們使用C/C\++延伸模組內建的提示,來幫助我們提示函式的名稱。然而本人認為C/C\++內建的提示其實挺破爛的,我自己是使用Clangd提示,會更方便一點。

> 新手最常見的錯誤 : scanf傳參忘記加&,clangd會直接幫你標示出來!
安裝也很簡單,首先一樣左邊延伸模組Clangd,安裝。

安裝完之後右下角會跳出兩個選項,按 Disable IntelliSense。
**請不要按Install,會出事。**

> 如果不小心點到Install請記得取消
之後則是下載Clangd,Clangd也可以在Msys2上下載到,打開Msys2終端機,輸入pacman -S mingw-w64-clang-x86_64-clang-tools-extra
```bash
pacman -S mingw-w64-clang-x86_64-clang-tools-extra
```

> 用Msys2安裝clangd
之後重開VSCode就可以了。
另外,這個時候自動排版的設定會跑掉,請回到[B. 自動排版](#B-自動排版)重新設定一次,但要選擇Clangd作為格式器。
## D. 根據後綴自動判別C/C++檔案並編譯
我們上面所用的設定是for C語言的,這個時候如果你用.cpp檔案寫一個C\++程式會發現編譯不讓你過,因此要改用C\++的編譯器。

> C++的Hello World程式,編譯報錯了
請在左邊的延伸模組尋找Command Variable,並安裝

> 安裝Command Variable延伸模組
之後請找到tasks.json,在檔案總管下的.vscode資料夾內。

> .vsocde資料夾內含VSCode的設定檔案
請將tasks.json的內容與下圖紅框的內容進行比對,並修改成與圖內一致。
```json
"type": "shell"
```
```json
clang${input:pickExtension}.exe
```
```json
"inputs": [
{
"id": "pickExtension",
"type": "command",
"command": "extension.commandvariable.file.fileAsKey",
"args": {
".cpp": "++",
".c": ""
}
}
]
```

如果tasks.json是複製我文章上的內容,請將clang那行修改,並加上inputs那些內容即可。

> 如果tasks.json是用複製的,結果如圖
修改好之後回到我們的C++檔案,按F5運行。

> 修改好之後使用clang++編譯,運行成功
可以發現我們的C++程式可以正常的執行了。
## E. 變更VSCode主題顏色
不習慣黑畫面? 想改成白畫面?
點選左下角設定->主題->色彩佈景主題

上面就會有很多選項給你選了。

---
好的,本篇教學就到此結束,本人第一次寫這種教學也是第一次用HackMD,若有問題歡迎留言詢問。