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

Visual Studio CodeでのClangの使用

このチュートリアルでは、macOS上でVisual Studio Codeを構成し、Clang/LLVMコンパイラとデバッガーを使用します。

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

何か問題が発生した場合は、VS Codeドキュメントリポジトリでこのチュートリアルに関するIssueを報告してください。

前提条件

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

  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++拡張機能から、新機能や修正をテストできるInsiderバージョンの利用可能性に関する通知が表示されることがあります。この通知は、X (通知をクリア) を選択して無視できます。

IntelliSense を探索する

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

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

Statement completion IntelliSense

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

IntelliSenseがまだ構成されていない場合は、コマンドパレット (⇧⌘P (Windows、Linux Ctrl+Shift+P)) を開き、Select IntelliSense Configuration と入力します。コンパイラのドロップダウンから 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 active fileを選択します。

    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})に、アクティブなファイルと同じ名前でファイル拡張子のない出力ファイル(-oスイッチ)を作成するように指示します(${fileBasenameNoExtension})。このプロセスでhelloworldが作成されます。

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

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

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

これ以降、再生ボタンは常にtasks.jsonからプログラムのビルド方法と実行方法を読み取ります。tasks.jsonに複数のビルドタスクを定義でき、デフォルトとしてマークされたタスクが再生ボタンによって使用されます。デフォルトコンパイラを変更する必要がある場合は、コマンドパレットでTasks: Configure Default Build Taskを実行できます。あるいは、tasks.jsonファイルを変更して、このセグメントを置き換えることでデフォルトを削除できます。

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

これで

    "group": "build",

tasks.json の変更

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

helloworld.cpp をデバッグする

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

  1. helloworld.cpp に戻り、アクティブ ファイルにします。

  2. エディターのマージンをクリックするか、現在の行でF9キーを使用してブレークポイントを設定します。

    screenshot of breakpoint in helloworld.cpp

  3. 再生ボタンの隣にあるドロップダウンから、Debug C/C++ Fileを選択します。

    Screenshot of play button drop-down

  4. システムで検出されたコンパイラのリストからC/C++: clang++ build and debug active fileを選択します (helloworld.cppを初めて実行またはデバッグするときにのみ、コンパイラの選択を求められます)。

    Build and debug task

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

    Hello World Terminal Output

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

デバッガーを探索する

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

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

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

    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++ build and debug active fileを選択します。C++デバッグ構成ドロップダウン

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++: Edit Configurations (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 framework pathがシステムヘッダーファイルを指していることを確認します。例: /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.json、またはc_cpp_properties.jsonファイルをコンパイルしようとしているためです。

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

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

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": []
}

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

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

次のステップ

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