現已釋出!閱讀關於 11 月新增功能和修復的內容。

配置 VS Code 以使用 Microsoft C++

在本教程中,您將在 Windows 上配置 Visual Studio Code 以使用 Microsoft Visual C++ 編譯器和偵錯程式。

配置 VS Code 後,您將在 VS Code 中編譯和除錯一個簡單的 Hello World 程式。本教程不介紹 Microsoft C++ 工具集或 C++ 語言的詳細資訊。有關這些主題,網上有很多很好的資源。

如果您有任何問題,請隨時在 VS Code 文件儲存庫中為本教程提交 issue。

先決條件

要成功完成本教程,您必須執行以下操作:

  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 Installer,並驗證是否已勾選 C++ 工作負載。如果未安裝,請勾選該框,然後在安裝程式中選擇“修改”按鈕。

    您也可以在不安裝完整 Visual Studio IDE 的情況下安裝“使用 C++ 的桌面開發”工作負載。從 Visual Studio 下載頁面,向下滾動直到在“所有下載”部分看到“Visual Studio 工具”,然後選擇“用於 Visual Studio 的生成工具 2022”的下載項。

    Build Tools for Visual Studio download

    這將啟動 Visual Studio Installer,它會彈出一個對話方塊,顯示可用的 Visual Studio 生成工具工作負載。勾選“使用 C++ 的桌面開發”工作負載,然後選擇“安裝”。

    Cpp build tools workload

注意:只要您擁有有效的 Visual Studio 許可證(社群版、專業版或企業版),就可以將 Visual Studio Build Tools 的 C++ 工具集與 Visual Studio Code 一起用於開發、生成和測試任何 C++ 程式碼。

檢查 Microsoft Visual C++ 安裝

要從命令列或 VS Code 使用 MSVC,您必須從“Visual Studio 的開發者命令提示符”執行。普通的 shell(如 PowerShell、Bash 或 Windows 命令提示符)沒有設定必要的路徑環境變數。

要開啟 VS 的開發者命令提示符,請在 Windows 開始選單中開始鍵入“developer”,您應該會在建議列表中看到它。確切的名稱取決於您安裝的 Visual Studio 版本或 Visual Studio Build Tools 版本。選擇該項以開啟提示符。

Developer Command Prompt

您可以透過鍵入“cl”來測試 C++ 編譯器 `cl.exe` 是否已正確安裝,您應該會看到一條版權訊息,其中包含版本和基本用法說明。

Checking cl.exe installation

如果開發者命令提示符將 BuildTools 位置作為起始目錄(您不希望將專案放在那裡),請導航到您的使用者資料夾(`C:\users\{your username}\`),然後再開始建立新專案。

注意:如果您出於某種原因無法從“開發者命令提示符”執行 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` 檔案中,將滑鼠懸停在 `vector` 或 `string` 上以檢視型別資訊。在 `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` problem matcher,將獲得最佳結果。

從現在開始,播放按鈕將從 tasks.json 中讀取資訊,以確定如何構建和執行你的程式。你可以在 tasks.json 中定義多個構建任務,而標記為預設的任務將被播放按鈕使用。如果你需要更改預設編譯器,可以執行任務: 配置預設生成任務。或者,你可以修改 tasks.json 檔案,並透過替換以下段落來刪除預設設定

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

替換為

    "group": "build",

修改 tasks.json

您可以透過使用類似 `"${workspaceFolder}/*.cpp"` 的引數而不是 `"${file}"` 來修改 `tasks.json` 以生成多個 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 迴圈的第一行,並跳過 `vector` 和 `string` 類中在建立和初始化 `msg` 變數時呼叫的所有內部函式呼叫。請注意左側“變數”視窗中的變化。

    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.exe`。`args` 屬性是一個在執行時傳遞給程式的引數陣列。

預設情況下,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 會將它們寫入 .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
}

僅當您的程式包含不在工作區或標準庫路徑中的標頭檔案時,才需要新增到“Include path”陣列設定中。

編譯器路徑

`compilerPath` 設定是您配置中的一個重要設定。擴充套件使用它來推斷 C++ 標準庫標頭檔案的路徑。當擴充套件知道這些檔案的位置時,它可以提供有用的功能,例如智慧補全和“轉到定義”導航。

C/C++ 擴充套件會嘗試根據其在系統上找到的內容,將 `compilerPath` 填充為預設編譯器位置。擴充套件會在幾個常見的編譯器位置中進行搜尋。

`compilerPath` 的搜尋順序是:

  • 首先檢查 Microsoft Visual C++ 編譯器Ope
  • 然後搜尋 Windows Subsystem for 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”術語

如果您看到錯誤“無法將“cl.exe”術語識別為 cmdlet、函式、指令碼檔案或可執行程式的名稱。”,這通常意味著您正在“Visual Studio 的開發者命令提示符”之外執行 VS Code,並且 VS Code 不知道 `cl.exe` 編譯器的路徑。

VS Code 必須從 Visual Studio 的開發者命令提示符啟動,或者任務必須配置為在開發者命令提示符之外執行

您可以透過開啟新終端(⌃⇧`(Windows、Linux Ctrl+Shift+`)並鍵入“cl”來驗證 VS Code 是否在開發者命令提示符的上下文中執行,以確認 `cl.exe` 對 VS Code 可用。

fatal error C1034: assert.h: 未設定 include 路徑

在這種情況下,`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.