🚀 在 VS Code 中取得

設定 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++ 擴充功能。您可以透過在擴充功能檢視中搜尋 'c++' 來安裝 C/C++ 擴充功能 (⇧⌘X (Windows、Linux Ctrl+Shift+X))。

    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 Code 使用 Visual Studio 組建工具中的 C++ 工具組來編譯、建置及驗證任何 C++ 程式碼基底,前提是您也擁有有效的 Visual Studio 授權 (Community、Pro 或 Enterprise),而且您正積極使用該授權來開發該 C++ 程式碼基底。

檢查您的 Microsoft Visual C++ 安裝

若要從命令列或 VS Code 使用 MSVC,您必須從 [適用於 Visual Studio 的開發人員命令提示字元] 執行。一般的 Shell,例如 PowerShell、Bash 或 Windows 命令提示字元,未設定必要的路徑環境變數。

若要開啟適用於 VS 的開發人員命令提示字元,請在 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 建置並偵錯作用中檔案]。

    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}) 中建立可執行檔 (/Fe: 參數),其名稱與作用中檔案相同,但副檔名為 .exe (${fileBasenameNoExtension}.exe),在我們的範例中會產生 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,以使用類似 "${workspaceFolder}/*.cpp" 而非 "${file}" 的引數來建置多個 C++ 檔案。這將建置目前資料夾中的所有 .cpp 檔案。您也可以修改輸出檔案名稱,方法是將 "${fileDirname}\\${fileBasenameNoExtension}.exe" 取代為硬式編碼的檔案名稱 (例如 "${workspaceFolder}\\myProgram.exe")。

偵錯 helloworld.cpp

若要偵錯您的程式碼,

  1. 返回 helloworld.cpp,使其成為作用中檔案。
  2. 透過按一下編輯器邊界或在目前行上使用 F9 來設定中斷點。helloworld.cpp 中斷點的螢幕擷取畫面
  3. 從播放按鈕旁的下拉式清單中,選取 [偵錯 C/C++ 檔案]。播放按鈕下拉式清單的螢幕擷取畫面
  4. 從系統上偵測到的編譯器清單中,選擇 [C/C++: cl.exe 建置並偵錯作用中檔案] (您只會在第一次執行或偵錯 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 button

    這會將程式執行推進到 for 迴圈的第一行,並跳過在建立和初始化 msg 變數時所叫用之 vectorstring 類別內的所有內部函式呼叫。請注意左側 [變數] 視窗中的變更。

    Debugging windows

    在此案例中,預期會發生錯誤,因為雖然迴圈的變數名稱現在對偵錯工具可見,但語句尚未執行,因此此時沒有任何內容可讀取。但是,msg 的內容是可見的,因為該語句已完成。

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

  3. 再次按下 [跳過] 以執行 cout 語句。(請注意,C++ 擴充功能不會將任何輸出列印到 [偵錯主控台],直到迴圈結束為止。)

  4. 如果您願意,您可以繼續按下 [跳過],直到向量中的所有文字都列印到主控台為止。但是,如果您很好奇,請嘗試按下 [逐步執行] 按鈕,以逐步執行 C++ 標準程式庫中的原始碼!

    Breakpoint in gcc standard library header

    若要返回您自己的程式碼,其中一種方法是持續按下 [跳過]。另一種方法是在程式碼中設定中斷點,方法是切換到程式碼編輯器中的 helloworld.cpp 索引標籤,將插入點放在迴圈內 cout 語句的某個位置,然後按下 F9。左側邊界中會出現一個紅色點,表示已在此行設定中斷點。

    Breakpoint in main

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

設定監看式

有時您可能會想要追蹤程式執行時變數的值。您可以透過在變數上設定監看式來執行此動作。

  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 建置並偵錯作用中檔案]。

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++: 編輯組態 (UI)] 來檢視 C/C++ 組態 UI。

Command Palette

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

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++ 編譯器Ope
  • 然後在適用於 Linux 的 Windows 子系統 (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' 無法辨識

如果您看到錯誤「詞彙 'cl.exe' 無法辨識為 Cmdlet、函式、指令檔或可操作程式的名稱。」,這通常表示您在 [適用於 Visual Studio 的開發人員命令提示字元] 之外執行 VS Code,而 VS Code 不知道 cl.exe 編譯器的路徑。

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

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

嚴重錯誤 C1034: assert.h: 未設定任何包含路徑

在此案例中,cl.exe 可透過 PATH 環境變數供 VS Code 使用,但 VS Code 仍然必須從 [適用於 Visual Studio 的開發人員命令提示字元] 啟動,或設定為在開發人員命令提示字元外執行。否則,cl.exe 無法存取重要的環境變數,例如 INCLUDE

後續步驟

  • 探索 VS Code 使用者指南
  • 檢閱 C++ 擴充功能概觀
  • 建立新的工作區,將您的 .vscode JSON 檔案複製到其中,調整新工作區路徑、程式名稱等的必要設定,然後開始撰寫程式碼!