VS Codeのエージェントモードを拡張するには、を試してください!

Visual Studio Code で Clang を使用する

このチュートリアルでは、macOS 上で Visual Studio Code を設定して、Clang/LLVM コンパイラとデバッガーを使用する方法について説明します。

VS Code の設定後、VS Code で C++ プログラムをコンパイルおよびデバッグします。このチュートリアルでは、Clang または C++ 言語については説明しません。これらの主題については、Web 上に多数の優れたリソースがあります。

ご不明な点がありましたら、このチュートリアルのVS Code ドキュメント リポジトリで気軽に問題を提起してください。

前提条件

このチュートリアルを正常に完了するには、以下の手順を実行する必要があります

  1. macOS に Visual Studio Code をインストールします。

  2. VS Code 用 C++ 拡張機能をインストールします。C/C++ 拡張機能は、拡張機能ビュー (⇧⌘X (Windows、Linux Ctrl+Shift+X)) で「C++」を検索してインストールできます。

    C/C++ extension

Clang がインストールされていることを確認する

Clang はすでに Mac にインストールされている可能性があります。インストールされていることを確認するには、macOS ターミナル ウィンドウを開き、次のコマンドを入力します

clang --version

Clang がインストールされていない場合は、次のコマンドを入力して、Clang を含むコマンドライン開発者ツールをインストールします。

xcode-select --install

Hello World アプリを作成する

macOS ターミナルから、すべての VS Code プロジェクトを格納できる projects という空のフォルダーを作成し、次に helloworld というサブフォルダーを作成し、その中に入り、ターミナル ウィンドウに次のコマンドを入力してそのフォルダーで VS Code を開きます。

mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .

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

  • tasks.json (コンパイラ ビルド設定)
  • launch.json (デバッガー設定)
  • c_cpp_properties.json (コンパイラのパスと IntelliSense の設定)

hello world ソース コード ファイルを追加する

ファイル エクスプローラーのタイトル バーで、新しいファイル ボタンを選択し、ファイル名をhelloworld.cppにします。

New File title bar button

次のソースコードを貼り付けます。

#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 を探索する

IntelliSense は、コード補完、パラメーター情報、クイック情報、メンバー リストなどのコード編集機能を追加することで、より高速かつ効率的にコーディングできるようにするツールです。

IntelliSense の動作を見るには、vector または string にカーソルを合わせると、その型情報が表示されます。10 行目に msg. と入力すると、IntelliSense によって生成された、推奨されるメンバー関数の補完リストが表示されます。

Statement completion IntelliSense

Tab キーを押して選択したメンバーを挿入できます。次に、開き括弧を追加すると、関数が必要とする引数に関する情報が表示されます。

IntelliSense がまだ構成されていない場合は、コマンド パレット (⇧⌘P (Windows、Linux Ctrl+Shift+P)) を開き、IntelliSense 構成の選択を入力します。コンパイラのドロップダウンから Use clang++ を選択して構成します。詳細については、IntelliSense 構成ドキュメントを参照してください。

helloworld.cpp を実行する

C++ 拡張機能は、マシンにインストールされている C++ コンパイラを使用してプログラムをビルドすることに注意してください。VS Code で helloworld.cpp を実行およびデバッグする前に、Clang などの C++ コンパイラがインストールされていることを確認してください。

  1. helloworld.cpp をアクティブ ファイルとして開きます。

  2. エディターの右上隅にある再生ボタンを押します。

    Screenshot of helloworld.cpp and play button

  3. システムで検出されたコンパイラのリストから、C/C++: clang++ アクティブ ファイルをビルドしてデバッグするを選択します。

    Build and debug task

コンパイラの選択を求められるのは、helloworld.cpp を初めて実行するときだけです。このコンパイラは、tasks.json ファイルに設定されている「既定」のコンパイラです。

  1. ビルドが成功すると、プログラムの出力が統合されたデバッグ コンソールに表示されます。

    screenshot of program output

おめでとうございます。VS Code で最初の C++ プログラムを実行しました!

tasks.json を理解する

プログラムを初めて実行すると、C++ 拡張機能によってプロジェクトの .vscode フォルダーに tasks.json が作成されます。tasks.json にはビルド構成が格納されます。

以下は、macOS 上の tasks.json ファイルのサンプルです。

{
  "tasks": [
    {
      "type": "cppbuild",
      "label": "C/C++: clang++ build active file",
      "command": "/usr/bin/clang++",
      "args": [
        "-fcolor-diagnostics",
        "-fansi-escape-codes",
        "-g",
        "${file}",
        "-o",
        "${fileDirname}/${fileBasenameNoExtension}"
      ],
      "options": {
        "cwd": "${fileDirname}"
      },
      "problemMatcher": ["$gcc"],
      "group": {
        "kind": "build",
        "isDefault": true
      },
      "detail": "Task generated by Debugger."
    }
  ],
  "version": "2.0.0"
}

注意: tasks.json の変数については、変数リファレンスで詳細を確認できます。

command 設定は、実行するプログラムを指定します。この場合、clang++ です。

args 配列は、clang++ に渡されるコマンドライン引数を指定します。これらの引数は、コンパイラが予期する順序で指定する必要があります。

このタスクは、C++ コンパイラに、アクティブなファイル (${file}) を取得してコンパイルし、現在のディレクトリ (${fileDirname}) に、アクティブなファイルと同じ名前でファイル拡張子なし (${fileBasenameNoExtension}) の出力ファイル (-o スイッチ) を作成するように指示します。このプロセスにより、helloworld が作成されます。

label 値は、タスク リストに表示されるもので、個人の好みに基づいています。

detail 値は、タスク リストのタスクの説明です。類似するタスクと区別するために、この文字列を更新します。

problemMatcher 値は、コンパイラの出力でエラーと警告を見つけるために使用する出力パーサーを選択します。clang++ の場合、$gcc 問題マッチャーが最良の結果を生成します。

今後、再生ボタンは常に tasks.json を読み取り、プログラムをビルドおよび実行する方法を判別します。tasks.json で複数のビルド タスクを定義できますが、既定としてマークされているタスクが再生ボタンによって使用されます。既定のコンパイラを変更する必要がある場合は、コマンド パレットでタスク: 既定のビルド タスクを構成するを実行できます。または、tasks.json ファイルを変更し、このセグメントを置き換えることで既定値を削除できます。

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

これで

    "group": "build",

tasks.json の変更

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

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++: clang++ アクティブ ファイルをビルドしてデバッグするを選択します (helloworld.cpp を初めて実行またはデバッグするときにのみ、コンパイラの選択を求められます)。

    Build and debug task

  5. タスクが実行され、出力がターミナル ウィンドウに表示されます。

    Hello World Terminal Output

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

デバッガーを探索する

コードのステップ実行を開始する前に、ユーザーインターフェイスのいくつかの変更点に注目してみましょう。

  • 統合ターミナルは、ソース コード エディターの下部に表示されます。デバッグ コンソール タブには、デバッガーが起動して実行中であることを示す出力が表示されます。

  • エディターは、デバッガーを開始する前にブレークポイントを設定した行を強調表示します。

    Initial breakpoint

  • アクティビティ バーの実行とデバッグビューには、デバッグ情報が表示されます。

  • コード エディターの上部にデバッグ コントロール パネルが表示されます。左側のドットを掴んで画面上を移動させることができます。

    Debugging controls

コードをステップ実行する

これで、コードのステップ実行を開始する準備ができました。

  1. デバッグ コントロール パネルのステップ オーバー アイコンを選択して、for (const string& word : msg) ステートメントが強調表示されるようにします。

    Step over button

    ステップ オーバー コマンドは、msg 変数が作成され初期化されるときに呼び出される vector および string クラス内のすべての内部関数呼び出しをスキップします。変数ウィンドウの変更に注意してください。そのステートメントが完了したため、msg の内容が表示されます。

  2. もう一度ステップ オーバーを押して、次のステートメントに進みます (ループを初期化するために実行されるすべての内部コードをスキップします)。これで、変数ウィンドウにループ変数の情報が表示されます。

  3. もう一度ステップ オーバーを押して、cout ステートメントを実行します。

  4. 必要に応じて、ベクター内のすべての単語がコンソールに出力されるまでステップ オーバーを押し続けることができます。ただし、興味がある場合は、ステップ インボタンを押して、C++ 標準ライブラリのソース コードをステップ実行してみてください。

ウォッチを設定する

プログラムの実行中に変数の値を追跡したい場合があります。これは、変数にウォッチを設定することで行えます。

  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++: clang++ アクティブ ファイルをビルドしてデバッグするを選択します。C++ debug configuration dropdown

VS Code はlaunch.jsonファイルを作成します。これは次のようになります。

{
  "configurations": [
    {
      "name": "C/C++: clang++ build and debug active file",
      "type": "cppdbg",
      "request": "launch",
      "program": "${fileDirname}/${fileBasenameNoExtension}",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${fileDirname}",
      "environment": [],
      "externalConsole": false,
      "MIMode": "lldb",
      "preLaunchTask": "C/C++: clang++ build active file"
    }
  ],
  "version": "2.0.0"
}

program 設定は、デバッグするプログラムを指定します。ここでは、アクティブなファイルのフォルダー ${fileDirname} とアクティブなファイル名 ${fileBasenameNoExtension} に設定されており、helloworld.cpp がアクティブなファイルの場合、これは helloworld になります。args プロパティは、実行時にプログラムに渡す引数の配列です。

既定では、C++ 拡張機能はソース コードにブレークポイントを追加せず、stopAtEntry の値は false に設定されています。

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

preLaunchTask の値が tasks.json ファイルのビルド タスクの label と一致することを確認します。

今後、再生ボタンと 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++ 構成ページが開きます。

C++ configuration

Visual Studio Code はこれらの設定を .vscode/c_cpp_properties.json に配置します。このファイルを直接開くと、次のようになります。

{
  "configurations": [
    {
      "name": "Mac",
      "includePath": ["${workspaceFolder}/**"],
      "defines": [],
      "macFrameworkPath": [
        "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks"
      ],
      "compilerPath": "/usr/bin/clang",
      "cStandard": "c11",
      "cppStandard": "c++17",
      "intelliSenseMode": "macos-clang-arm64"
    }
  ],
  "version": 4
}

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

コンパイラのパス

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

C/C++ 拡張機能は、システムで見つかったものに基づいて、既定のコンパイラの場所で compilerPath を設定しようとします。compilerPath の検索順序は次のとおりです。

  • 既知のコンパイラの名前に対する PATH。コンパイラがリストに表示される順序は、PATH によって異なります。
  • 次に、/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ のようなハードコードされた Xcode パスが検索されます。

詳細については、IntelliSense 構成ドキュメントを参照してください。

Mac フレームワーク パス

C/C++ 構成画面で、下へスクロールして高度な設定を展開し、Mac フレームワーク パスがシステム ヘッダー ファイルを指していることを確認します。例: /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks

トラブルシューティング

コンパイラとリンクのエラー

エラー (undefined _mainattempting to link with file built for unknown-unsupported file format など) の最も一般的な原因は、ビルドを開始したりデバッグを開始したりするときに、helloworld.cpp がアクティブなファイルでない場合に発生します。これは、コンパイラがソース コードではない、launch.jsontasks.jsonc_cpp_properties.json などのファイルをコンパイルしようとしているためです。

"C++11 extensions" を参照するビルド エラーが表示される場合、tasks.json ビルド タスクを更新して clang++ 引数 --std=c++17 を使用していない可能性があります。既定では、clang++ は C++98 標準を使用しており、helloworld.cpp で使用されている初期化をサポートしていません。tasks.json ファイルのすべての内容を、helloworld.cpp を実行するセクションに示されているコード ブロックで置き換えるようにしてください。

入力のためにターミナルが起動しない

macOS Catalina 以降では、"externalConsole": true を設定しても入力できない問題が発生する場合があります。ターミナル ウィンドウが開きますが、実際には入力をタイプできません。

この問題は現在、#5079 で追跡されています。

回避策は、VS Code がターミナルを一度起動するようにすることです。これは、tasks.json に次のタスクを追加して実行することで行えます。

{
  "label": "Open Terminal",
  "type": "shell",
  "command": "osascript -e 'tell application \"Terminal\"\ndo script \"echo hello\"\nend tell'",
  "problemMatcher": []
}

この特定のタスクは、ターミナル > タスクの実行... を使用してターミナルを開くを選択することで実行できます。

アクセス許可要求を承認すると、デバッグ時に外部コンソールが表示されるはずです。

次のステップ

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