🚀 VS Code で で入手しましょう!

Microsoft C++ 用の VS Code の構成

このチュートリアルでは、Windows 上で Microsoft Visual C++ コンパイラとデバッガーを使用するように Visual Studio Code を構成します。

VS Code を構成した後、VS Code で簡単な Hello World プログラムをコンパイルおよびデバッグします。このチュートリアルでは、Microsoft C++ ツールセットまたは C++ 言語の詳細については説明しません。これらの主題については、Web 上に多くの優れたリソースがあります。

問題が発生した場合は、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] のダウンロードを選択します。

    Build Tools for Visual Studio download

    これにより Visual Studio インストーラーが起動し、利用可能な Visual Studio Build Tools ワークロードを示すダイアログが表示されます。[C++ によるデスクトップ開発] ワークロードをチェックし、[インストール] を選択します。

    Cpp build tools workload

: Visual Studio Build Tools の C++ ツールセットを Visual Studio Code と組み合わせて使用して、C++ コードベースをコンパイル、ビルド、および検証できます。ただし、その C++ コードベースの開発に積極的に使用している有効な Visual Studio ライセンス (Community、Pro、または Enterprise) も必要です。

Microsoft Visual C++ のインストールを確認する

コマンドラインまたは VS Code から MSVC を使用するには、Visual Studio 用開発者コマンドプロンプトから実行する必要があります。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\{ユーザー名}\) に移動します。

: 何らかの理由で開発者コマンドプロンプトから VS Code を実行できない場合は、「開発者コマンドプロンプト外で VS Code を実行する」で VS Code を使用して C++ プロジェクトをビルドするための回避策を見つけることができます。

Hello World の作成

開発者コマンドプロンプトから、すべての VS Code プロジェクトを保存できる "projects" という名前の空のフォルダーを作成し、次に "helloworld" という名前のサブフォルダーを作成し、それに移動して、次のコマンドを入力してそのフォルダー (.) で VS Code (code) を開きます。

mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .

"code ." コマンドは、現在の作業フォルダーで VS Code を開き、それが "ワークスペース" になります。チュートリアルを進めていくと、ワークスペースの .vscode フォルダーに 3 つのファイルが作成されることがわかります。

  • 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}) に、アクティブなファイルと同じ名前で、ただし .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 の変更

"${file}" の代わりに "${workspaceFolder}/*.cpp" のような引数を使用すると、tasks.json を変更して複数の C++ ファイルをビルドできます。これにより、現在のフォルダー内のすべての .cpp ファイルがビルドされます。また、"${fileDirname}\\${fileBasenameNoExtension}.exe" をハードコードされたファイル名 (たとえば、"${workspaceFolder}\\myProgram.exe") に置き換えることで、出力ファイル名を変更することもできます。

helloworld.cpp のデバッグ

コードをデバッグするには、

  1. helloworld.cpp に戻ってアクティブなファイルにします。
  2. エディターの余白をクリックするか、現在の行で F9 キーを使用してブレークポイントを設定します。 screenshot of breakpoint in helloworld.cpp
  3. 再生ボタンの横にあるドロップダウンから [C/C++ ファイルのデバッグ] を選択します。 Screenshot of play button drop-down
  4. システムで検出されたコンパイラの一覧から [C/C++: cl.exe ビルドとアクティブなファイルのデバッグ] を選択します (コンパイラの選択を求められるのは、helloworld.cpp を初めて実行またはデバッグするときだけです)。 C++ debug configuration dropdown

再生ボタンには、[C/C++ ファイルの実行] と [C/C++ ファイルのデバッグ] の 2 つのモードがあります。最後に使用したモードが既定になります。再生ボタンにデバッグアイコンが表示されている場合は、ドロップダウンメニュー項目を選択する代わりに、再生ボタンを選択してデバッグできます。

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 変数が作成および初期化されたときに呼び出される vector および string クラス内のすべての内部関数呼び出しがスキップされます。左側の [変数] ウィンドウの変化に注目してください。

    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 に設定されています。

デバッグを開始するときにデバッガーが main メソッドで停止するようにするには、stopAtEntry 値を true に変更します。

今後、再生ボタンと 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
}

プログラムに、ワークスペースまたは標準ライブラリパスにないヘッダーファイルが含まれている場合にのみ、[インクルードパス] 配列設定に追加する必要があります。

コンパイラパス

compilerPath 設定は、構成の重要な設定です。拡張機能はそれを使用して、C++ 標準ライブラリヘッダーファイルへのパスを推測します。拡張機能がこれらのファイルの場所を認識している場合、スマート補完や [定義へ移動] ナビゲーションなどの便利な機能を提供できます。

C/C++ 拡張機能は、システムで見つけたものに基づいて、compilerPath に既定のコンパイラの場所を設定しようとします。拡張機能は、いくつかの一般的なコンパイラの場所を検索します。

compilerPath の検索順序は次のとおりです。

  • まず、Microsoft Visual C++ コンパイラを確認します。
  • 次に、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 のバージョンまたはインストールパスによって異なる場合があります。VsDevCmd.bat へのパスは、コマンドプロンプトを開いて dir "\VsDevCmd*" /s を実行することで見つけることができます。

トラブルシューティング

用語 'cl.exe' が認識されません

「用語 'cl.exe' は、コマンドレット、関数、スクリプトファイル、または操作可能なプログラムの名前として認識されません。」というエラーが表示される場合は、通常、Visual Studio 用開発者コマンドプロンプト外で VS Code を実行していて、VS Code が cl.exe コンパイラへのパスを認識していないことを意味します。

VS Code は、Visual Studio 用開発者コマンドプロンプトから起動するか、タスクを 開発者コマンドプロンプト外で実行するように構成する必要があります。

新しいターミナル (⌃⇧` (Windows、Linux Ctrl+Shift+`)) を開き、'cl' と入力して cl.exe が VS Code で使用できることを確認することで、常に開発者コマンドプロンプトのコンテキストで VS Code を実行していることを確認できます。

fatal error C1034: assert.h: インクルードパスが設定されていません

この場合、cl.exePATH 環境変数を介して VS Code で使用できますが、VS Code は依然として Visual Studio 用開発者コマンドプロンプトから起動するか、開発者コマンドプロンプト外で実行するように構成する必要があります。そうしないと、cl.exeINCLUDE などの重要な環境変数にアクセスできません。

次のステップ

  • VS Code ユーザーガイドをご覧ください。
  • C++ 拡張機能の概要を確認してください。
  • 新しいワークスペースを作成し、.vscode JSON ファイルをそこにコピーし、新しいワークスペースパス、プログラム名などの必要な設定を調整して、コーディングを開始します。