設定 VS Code 以進行 Microsoft C++ 開發

在本教學課程中,您將設定 Visual Studio Code 以在 Windows 上使用 Microsoft Visual C++ 編譯器與偵錯工具。

設定好 VS Code 後,您將在 VS Code 中編譯並偵錯一個簡單的 Hello World 程式。本教學課程不會教導 Microsoft C++ 工具組或 C++ 語言的詳細資訊。針對這些主題,網路上有許多優質的資源可供參考。

如果您遇到任何問題,歡迎在 VS Code 文件儲存庫中為本教學課程提交問題。

先決條件

若要順利完成本教學課程,您必須執行下列操作:

  1. 安裝 Visual Studio Code

  2. 安裝 VS Code 的 C/C++ 延伸模組。您可以透過延伸模組檢視(⇧⌘X (Windows, Linux Ctrl+Shift+X))搜尋 'c++' 來安裝 C/C++ 延伸模組。

    C/C++ extension

  3. 安裝 Microsoft Visual C++ (MSVC) 編譯器工具組。

    如果您有較新版本的 Visual Studio,請從 Windows 開始功能表開啟 Visual Studio 安裝程式,並驗證已勾選 C++ 工作負載。如果尚未安裝,請勾選該方塊並在安裝程式中選取「修改」按鈕。

    您也可以在不安裝完整 Visual Studio IDE 的情況下,安裝「使用 C++ 的桌面開發」工作負載。在 Visual Studio 下載頁面上,向下捲動直到在「所有下載」區段下看到「Visual Studio 工具」,然後選取「Visual Studio 2022 建置工具」進行下載。

    Build Tools for Visual Studio download

    這將啟動 Visual Studio 安裝程式,並顯示包含可用 Visual Studio 建置工具工作負載的對話方塊。勾選「使用 C++ 的桌面開發」工作負載,然後選取「安裝」。

    Cpp build tools workload

注意:只要您擁有有效的 Visual Studio 授權(Community、Pro 或 Enterprise 版),即可使用 Visual Studio 建置工具中的 C++ 工具組搭配 Visual Studio Code 來開發、建置並測試任何 C++ 程式碼。

檢查您的 Microsoft Visual C++ 安裝

若要從命令列或 VS Code 使用 MSVC,您必須從「Visual Studio 的開發人員命令提示字元」執行。普通的殼層(如 PowerShell、Bash 或 Windows 命令提示字元)並未設定必要的路徑環境變數。

若要開啟 Visual Studio 的開發人員命令提示字元,請在 Windows 開始功能表輸入 'developer',您應該會在建議清單中看到它出現。確切名稱取決於您安裝的 Visual Studio 版本或 Visual Studio 建置工具。選取該項目即可開啟提示字元。

Developer Command Prompt

您可以透過輸入 'cl' 來測試是否正確安裝了 C++ 編譯器 cl.exe,您應該會看到包含版本與基本用法說明的著作權訊息。

Checking cl.exe installation

如果開發人員命令提示字元使用 BuildTools 位置作為啟動目錄(您不會想把專案放在那裡),請在開始建立新專案之前,先瀏覽至您的使用者資料夾 (C:\users\{您的使用者名稱}\)。

注意:如果因為某些原因導致您無法從「開發人員命令提示字元」執行 VS Code,您可以在在開發人員命令提示字元之外執行 VS Code 中找到使用 VS Code 建置 C++ 專案的替代方案。

建立 Hello World

從開發人員命令提示字元中,建立一個名為 "projects" 的空資料夾來儲存您所有的 VS Code 專案,然後建立一個名為 "helloworld" 的子資料夾,進入該資料夾,並透過輸入下列命令在該資料夾 (.) 中開啟 VS Code (code):

mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .

"code ." 命令會在目前工作資料夾中開啟 VS Code,該資料夾即成為您的「工作區」。隨著本教學課程的進行,您會看到工作區中 .vscode 資料夾內建立了三個檔案:

  • tasks.json(建置指示)
  • launch.json(偵錯工具設定)
  • c_cpp_properties.json(編譯器路徑與 IntelliSense 設定)

新增原始程式碼檔案

在檔案總管標題列中,選取新增檔案按鈕,並將檔案命名為 helloworld.cpp

New File title bar button

新增 hello world 原始程式碼

現在請貼上這段原始程式碼

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    vector<string> msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"};

    for (const string& word : msg)
    {
        cout << word << " ";
    }
    cout << endl;
}

現在按下 ⌘S (Windows, Linux Ctrl+S) 來儲存檔案。請注意,您剛新增的檔案會出現在 VS Code 側邊欄的「檔案總管」檢視(⇧⌘E (Windows, Linux Ctrl+Shift+E))中。

File Explorer

您也可以勾選「檔案」主選單中的「自動儲存」,啟用自動儲存功能來自動儲存檔案變更。

最左側的活動列可讓您開啟不同的檢視,例如「搜尋」、「原始檔控制」與「執行」。您稍後會在教學課程中看到「執行」檢視。您可以在 VS Code 使用者介面文件中深入了解其他檢視。

注意:當您儲存或開啟 C++ 檔案時,您可能會看到 C/C++ 擴充功能關於 Insiders 版本可用性的通知,這讓您可以測試新功能與修正。您可以選取 X清除通知)來忽略此通知。

探索 IntelliSense

在新的 helloworld.cpp 檔案中,將滑鼠懸停在 vectorstring 上以查看類型資訊。在宣告 msg 變數之後,開始輸入 msg.(如同呼叫成員函式時一樣)。您應該會立即看到一個完成清單,顯示所有成員函式,以及一個視窗顯示 msg 物件的類型資訊。

Statement completion IntelliSense

您可以按下 Tab 鍵插入選取的成員;接著,當您加入左括號時,您會看到該函式所需任何引數的相關資訊。

執行 helloworld.cpp

請記住,C++ 延伸模組會使用您電腦上安裝的 C++ 編譯器來建置您的程式。在嘗試於 VS Code 中執行及偵錯 helloworld.cpp 之前,請務必先安裝 C++ 編譯器。

  1. 開啟 helloworld.cpp 使其成為作用中檔案。

  2. 按下編輯器右上角的執行按鈕。

    Screenshot of helloworld.cpp and play button

  3. 從系統上偵測到的編譯器清單中,選擇 C/C++: cl.exe build and debug active file

    C++ debug configuration dropdown

您只需要在第一次執行 helloworld.cpp 時選擇編譯器。此編譯器將設定為 tasks.json 檔案中的「預設」編譯器。

  1. 建置成功後,您的程式輸出將會出現在整合式的「終端機」中。

    screenshot of program output

如果您嘗試使用 cl.exe 建置並偵錯時收到錯誤,請確保您已使用 code . 捷徑從 Visual Studio 的開發人員命令提示字元啟動 VS Code

Error notification when trying to use MSVC without running VS Code from the Developer Command Prompt for VS

您第一次執行程式時,C++ 延伸模組會建立 tasks.json,您可以在專案的 .vscode 資料夾中找到它。tasks.json 用於儲存建置設定。

您新的 tasks.json 檔案應該類似於下方的 JSON:

{
  "version": "2.0.0",
  "tasks": [
    {
      "type": "shell",
      "label": "C/C++: cl.exe build active file",
      "command": "cl.exe",
      "args": [
        "/Zi",
        "/EHsc",
        "/Fe:",
        "${fileDirname}\\${fileBasenameNoExtension}.exe",
        "${file}"
      ],
      "problemMatcher": ["$msCompile"],
      "group": {
        "kind": "build",
        "isDefault": true
      },
      "detail": "Task generated by Debugger."
    }
  ]
}

注意:您可以在 變數參考中進一步了解 tasks.json 變數。

command 設定指定要執行的程式;在此情況下為 "cl.exe"。args 陣列指定將傳遞給 cl.exe 的命令列引數。這些引數必須依照編譯器預期的順序指定。

此工作指示 C++ 編譯器取得使用中的檔案 (${file})、進行編譯,並在目前目錄 (${fileDirname}) 中建立一個與使用中檔案名稱相同但副檔名為 .exe (${fileBasenameNoExtension}.exe) 的執行檔 (/Fe: 開關),在本範例中即產生 helloworld.exe

label 值是您在工作清單中看到的名稱;您可以隨意命名。

detail 值是您在工作清單中作為工作說明所看到的內容。強烈建議重新命名此值,以便與類似的工作區分開來。

problemMatcher 值選擇用於在編譯器輸出中尋找錯誤與警告的輸出解析器。對於 cl.exe,如果您使用 $msCompile 問題比對器,將會獲得最佳結果。

從現在起,播放按鈕將讀取 tasks.json 來判斷如何建置並執行您的程式。您可以在 tasks.json 中定義多個建置工作,而標記為預設的工作將由播放按鈕使用。如果您需要變更預設編譯器,可以執行「工作:設定預設建置工作」。或者,您也可以修改 tasks.json 檔案,透過取代該區段來移除預設值。

    "group": {
        "kind": "build",
        "isDefault": true
    },

取代為

    "group": "build",

修改 tasks.json

您可以修改 tasks.json 以建置多個 C++ 檔案,方式是使用像 "${workspaceFolder}/*.cpp" 而非 "${file}" 的引數。這將會建置目前資料夾中的所有 .cpp 檔案。您也可以透過將 "${fileDirname}\\${fileBasenameNoExtension}.exe" 取代為硬編碼的檔名(例如 "${workspaceFolder}\\myProgram.exe")來修改輸出檔名。

偵錯 helloworld.cpp

若要偵錯您的程式碼:

  1. 回到 helloworld.cpp 使其成為作用中檔案。
  2. 透過點擊編輯器邊界或在目前行上使用 F9 來設定中斷點。 helloworld.cpp 中斷點截圖
  3. 從播放按鈕旁的下拉式選單中,選取 Debug C/C++ File播放按鈕下拉式選單截圖
  4. 從系統上偵測到的編譯器清單中選擇 C/C++: cl.exe build and debug active file(您只需要在第一次執行或偵錯 helloworld.cpp 時選擇編譯器)。 C++ 偵錯設定下拉式選單

播放按鈕有兩種模式:執行 C/C++ 檔案偵錯 C/C++ 檔案。它會預設為上次使用的模式。如果您在播放按鈕中看到偵錯圖示,您可以直接選取播放按鈕來進行偵錯,而無需選取下拉式選單項目。

如果您嘗試使用 cl.exe 建置並偵錯時收到錯誤,請確保您已使用 code . 捷徑從 Visual Studio 的開發人員命令提示字元啟動 VS Code

Error notification when trying to use MSVC without running VS Code from the Developer Command Prompt for VS

探索偵錯器

在開始逐步執行程式碼之前,讓我們花點時間留意使用者介面的幾項變更

  • 整合式終端機會出現在原始碼編輯器的底部。在「偵錯輸出」索引標籤中,您會看到指出偵錯工具正在執行中的輸出。

  • 編輯器會反白顯示您在啟動偵錯工具前設定中斷點的那一行。

    Initial breakpoint

  • 左側的「執行與偵錯」檢視會顯示偵錯資訊。您稍後會在教學課程中看到範例。

  • 在程式碼編輯器的頂部,會出現一個偵錯控制面板。您可以透過抓取左側的點將其移至畫面其他位置。

    Debugging controls

逐步執行程式碼

現在您已準備好開始逐步執行程式碼。

  1. 點擊或按下偵錯控制面板中的「跳過 (Step over)」圖示。

    Step over button

    這會將程式執行推進到 for 迴圈的第一行,並跳過 vectorstring 類別內的所有內部函式呼叫(這些呼叫是在建立與初始化 msg 變數時引發的)。請注意左側「變數」視窗中的變化。

    Debugging windows

    在此情況下,這些錯誤是預期中的,因為雖然迴圈的變數名稱現在對偵錯工具可見,但該陳述式尚未執行,因此此時無內容可讀取。不過,msg 的內容是可見的,因為該陳述式已經完成。

  2. 再次按下「跳過」以推進到程式中的下一個陳述式(跳過初始化迴圈所執行的所有內部程式碼)。現在,「變數」視窗會顯示迴圈變數的相關資訊。

  3. 再次按下「跳過」以執行 cout 陳述式。(請注意,C++ 延伸模組在迴圈結束前,不會將任何輸出列印到「偵錯主控台」。)

  4. 如果您願意,可以持續按下逐步跳過,直到向量中的所有單字都列印到主控台為止。但如果您感到好奇,請嘗試按下逐步執行 (Step Into) 按鈕,以逐步追蹤 C++ 標準函式庫中的原始程式碼!

    Breakpoint in gcc standard library header

    若要回到您自己的程式碼,一種方法是持續按下「跳過」。另一種方法是在您的程式碼中設定中斷點:切換至程式碼編輯器中的 helloworld.cpp 索引標籤,將插入點放在迴圈內 cout 陳述式的某處,然後按下 F9。左側裝訂邊會出現一個紅點,表示已在此行設定中斷點。

    Breakpoint in main

    然後按下 F5 從標準程式庫標頭中的目前行開始執行。程式執行將會在 cout 處中斷。如果您願意,可以再次按下 F9 來取消中斷點。

設定監看式 (Watch)

有時您可能需要在程式執行時追蹤某個變數的值。您可以透過對該變數設定「監看式 (watch)」來達成。

  1. 將插入點放置在迴圈內。在「監看」視窗中,選取加號並在文字方塊中輸入 word,即迴圈變數的名稱。現在,當您逐行執行迴圈時,請查看監看視窗。

    Watch window

  2. 在迴圈前新增此陳述式以增加另一個監看式:int i = 0;。然後在迴圈內新增此陳述式:++i;。現在,像前一步驟那樣,為 i 新增監看式。

  3. 若要在執行於中斷點暫停時快速查看任何變數的值,您可以將滑鼠指標懸停在該變數上。

    Mouse hover

使用 launch.json 自訂偵錯

當您使用執行按鈕或 F5 進行偵錯時,C++ 擴充功能會即時建立動態偵錯設定。

在某些情況下,您會希望自訂偵錯設定,例如指定在執行階段傳遞給程式的參數。您可以在 launch.json 檔案中定義自訂偵錯設定。

若要建立 launch.json,請從執行按鈕下拉式選單中選擇 新增偵錯設定

Add debug configuration play button menu

接著您會看到各種預先定義偵錯設定的下拉式選單。選擇 C/C++: cl.exe build and debug active file

C++ debug configuration dropdown

VS Code 會建立一個 launch.json 檔案,看起來會像這樣

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "C/C++: cl.exe build and debug active file",
      "type": "cppvsdbg",
      "request": "launch",
      "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": false,
      "preLaunchTask": "C/C++: cl.exe build active file"
    }
  ]
}

在上述 JSON 中,program 指定了您要偵錯的程式。此處設定為使用中的檔案資料夾 (${fileDirname}) 與使用中的檔名並加上 .exe 副檔名 (${fileBasenameNoExtension}.exe);如果 helloworld.cpp 是使用中的檔案,則會是 helloworld.exeargs 屬性是執行時要傳遞給程式的引數陣列。

預設情況下,C++ 延伸模組不會在您的原始程式碼中新增任何中斷點,且 stopAtEntry 值設定為 false

stopAtEntry 值變更為 true,以讓偵錯工具在您開始偵錯時於 main 方法停下。

從現在起,當您啟動程式進行偵錯時,執行按鈕與 F5 都會讀取您的 launch.json 檔案。

C/C++ 設定

如果您想要更精確地控制 C/C++ 延伸模組,可以建立一個 c_cpp_properties.json 檔案,這將允許您變更設定,例如編譯器路徑、包含路徑、C++ 標準(預設為 C++17)等。

您可以透過從命令選擇區(⇧⌘P (Windows, Linux Ctrl+Shift+P))執行 C/C++: Edit Configurations (UI) 命令來查看 C/C++ 設定 UI。

Command Palette

這會開啟 C/C++ 設定頁面。當您在此處進行變更時,VS Code 會將其寫入 .vscode 資料夾中名為 c_cpp_properties.json 的檔案。

Command Palette

Visual Studio Code 會將這些設定放置於 .vscode\c_cpp_properties.json。如果您直接開啟該檔案,它看起來應該像這樣:

{
  "configurations": [
    {
      "name": "Win32",
      "includePath": ["${workspaceFolder}/**"],
      "defines": ["_DEBUG", "UNICODE", "_UNICODE"],
      "windowsSdkVersion": "10.0.18362.0",
      "compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.24.28314/bin/Hostx64/x64/cl.exe",
      "cStandard": "c11",
      "cppStandard": "c++17",
      "intelliSenseMode": "msvc-x64"
    }
  ],
  "version": 4
}

只有在您的程式包含不在工作區或標準程式庫路徑中的標頭檔時,才需要新增至「包含路徑」陣列設定。

編譯器路徑

compilerPath 是您設定中的重要選項。延伸模組會使用它來推斷 C++ 標準程式庫標頭檔的路徑。當延伸模組知道去哪裡尋找這些檔案時,便能提供實用的功能,例如智慧完成與「前往定義」導覽。

C/C++ 延伸模組會嘗試根據在您系統上找到的內容,以預設編譯器位置填入 compilerPath。延伸模組會查看多個常見的編譯器位置。

compilerPath 的搜尋順序為:

  • 首先檢查 Microsoft Visual C++ 編譯器
  • 然後尋找 Windows 子系統 Linux 版 (WSL) 上的 g++
  • 然後尋找 Mingw-w64 的 g++。

如果您安裝了 g++ 或 WSL,可能需要變更 compilerPath 以符合專案的首選編譯器。對於 Microsoft C++,路徑看起來應該類似這樣(視您安裝的特定版本而定):"C:/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/cl.exe"。

重複使用您的 C++ 設定

VS Code 現在已設定為使用 Microsoft C++ 編譯器。此設定適用於目前的工作區。若要重複使用此設定,只需將 JSON 檔案複製到新專案資料夾(工作區)中的 .vscode 資料夾,並根據需要變更原始檔案與執行檔的名稱即可。

在「開發人員命令提示字元」之外執行 VS Code

在某些情況下,無法從「Visual Studio 的開發人員命令提示字元」執行 VS Code(例如透過 SSH 進行遠端開發的場景)。在此情況下,您可以使用下列 tasks.json 設定,在建置過程中自動初始化「Visual Studio 的開發人員命令提示字元」:

{
  "version": "2.0.0",
  "windows": {
    "options": {
      "shell": {
        "executable": "cmd.exe",
        "args": [
          "/C",
          // The path to VsDevCmd.bat depends on the version of Visual Studio you have installed.
          "\"C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/Tools/VsDevCmd.bat\"",
          "&&"
        ]
      }
    }
  },
  "tasks": [
    {
      "type": "shell",
      "label": "cl.exe build active file",
      "command": "cl.exe",
      "args": [
        "/Zi",
        "/EHsc",
        "/Fe:",
        "${fileDirname}\\${fileBasenameNoExtension}.exe",
        "${file}"
      ],
      "problemMatcher": ["$msCompile"],
      "group": {
        "kind": "build",
        "isDefault": true
      }
    }
  ]
}

注意VsDevCmd.bat 的路徑可能會因 Visual Studio 版本或安裝路徑而異。您可以透過開啟命令提示字元並執行 dir "\VsDevCmd*" /s 來找到 VsDevCmd.bat 的路徑。

疑難排解

無法辨識 'cl.exe' 這個詞彙

如果您看到錯誤訊息 "The term 'cl.exe' is not recognized as the name of a cmdlet, function, script file, or operable program."(無法將 'cl.exe' 辨識為 Cmdlet、函式、指令碼檔案或可執行程式的名稱),這通常表示您在「Visual Studio 的開發人員命令提示字元」之外執行 VS Code,且 VS Code 不知道 cl.exe 編譯器的路徑。

必須從 Visual Studio 的開發人員命令提示字元啟動 VS Code,或是必須將工作設定為在開發人員命令提示字元之外執行

您可以隨時開啟新的終端機(⌃⇧` (Windows, Linux Ctrl+Shift+`))並輸入 'cl' 來驗證 cl.exe 是否可供 VS Code 使用,藉此檢查您是否在開發人員命令提示字元的內容中執行 VS Code。

致命錯誤 C1034: assert.h: 未設定包含路徑

在此情況下,cl.exe 可透過 PATH 環境變數供 VS Code 使用,但 VS Code 仍然需要從「Visual Studio 的開發人員命令提示字元」啟動,或是設定為在開發人員命令提示字元之外執行。否則,cl.exe 將無法存取重要的環境變數,例如 INCLUDE

後續步驟

  • 探索 VS Code 使用者指南
  • 查閱 C++ 擴充功能總覽
  • 建立新的工作區,將您的 .vscode JSON 檔案複製進去,為新的工作區路徑、程式名稱等調整必要設定,然後開始寫程式吧!
© . This site is unofficial and not affiliated with Microsoft.