Visual Studio Code での Clang の使用
このチュートリアルでは、macOS 上の Visual Studio Code を構成して、Clang/LLVM コンパイラおよびデバッガを使用できるようにします。
VS Code の構成後、VS Code で C++ プログラムをコンパイルおよびデバッグします。このチュートリアルでは、Clang や C++ 言語自体については説明しません。これらのトピックについては、Web 上に多くの優れたリソースが提供されています。
何か問題が発生した場合は、お気軽に VS Code ドキュメント リポジトリでこのチュートリアルに関する問題を報告してください。
前提条件
このチュートリアルを正常に完了するには、次の手順を実行する必要があります。
-
macOS に Visual Studio Code をインストールします。
-
VS Code 用の C++ 拡張機能をインストールします。C/C++ 拡張機能は、[拡張機能] ビュー(⇧⌘X (Windows, Linux Ctrl+Shift+X))で「C++」を検索してインストールできます。

Clang がインストールされていることの確認
Mac にはすでに Clang がインストールされている場合があります。インストールされているか確認するには、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とします。

次のソース コードを貼り付けます。
#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))にファイルが一覧表示されていることを確認してください

[ファイル] > [自動保存] を選択して、ファイルの変更を自動的に保存する 自動保存 を有効にすることもできます。他のビューの詳細については、VS Code の ユーザー インターフェース ドキュメント を参照してください。
注意: C++ ファイルを保存または開くと、C/C++ 拡張機能から Insiders バージョンの利用可能性に関する通知が表示される場合があります。これにより、新機能や修正をテストできます。
X(通知をクリア) を選択して、この通知を無視できます。
IntelliSense を探索する
IntelliSense は、コード補完、パラメータ情報、クイック情報、メンバーリストなどのコード編集機能を追加することにより、より迅速かつ効率的にコードを作成できるようにするツールです。
IntelliSense の動作を確認するには、vector または string の上にマウスポインターを置いて、それらの型情報を表示させます。10 行目で msg. と入力すると、呼び出すべき推奨メンバー関数の補完リストが表示されます。これらはすべて 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++ コンパイラがインストールされていることを確認してください。
-
helloworld.cppを開いて、アクティブなファイルにします。 -
エディタの右上隅にある再生ボタンを押します。

-
システム上で検出されたコンパイラのリストから、[C/C++: clang++ build and debug active file] を選択します。

コンパイラの選択を求められるのは、最初に helloworld.cpp を実行するときだけです。このコンパイラは、tasks.json ファイルで設定される「デフォルト」のコンパイラになります。
-
ビルドが成功すると、プログラムの出力が統合された [デバッグ コンソール] に表示されます。

おめでとうございます!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.json ファイルを変更し、次のセグメントを置き換えることでデフォルトを削除することもできます
"group": {
"kind": "build",
"isDefault": true
},
これを置き換えます。
"group": "build",
tasks.json の変更
tasks.json を変更して、"${file}" の代わりに "${workspaceFolder}/*.cpp" のような引数を使用することで、複数の C++ ファイルをビルドできます。これにより、現在のフォルダー内にあるすべての .cpp ファイルがビルドされます。また、"${fileDirname}/${fileBasenameNoExtension}" をハードコードされたファイル名(例: "${workspaceFolder}/myProgram.out")に置き換えることで、出力ファイル名を変更することもできます。
helloworld.cpp をデバッグする
コードをデバッグするには、
-
helloworld.cppに戻って、アクティブなファイルにします。 -
エディターの余白をクリックするか、現在の行で F9 キーを押して、ブレークポイントを設定します。

-
再生ボタンの横にあるドロップダウンから、[C/C++ ファイルのデバッグ] を選択します。

-
システム上で検出されたコンパイラのリストから、[C/C++: clang++ build and debug active file] を選択します(コンパイラの選択を求められるのは、初めて
helloworld.cppを実行またはデバッグするときだけです)。
-
タスクが実行され、[ターミナル] ウィンドウに出力が出力されるのが確認できます。

再生ボタンには、[C/C++ ファイルの実行] と [C/C++ ファイルのデバッグ] の 2 つのモードがあります。デフォルトは、最後に使用されたモードです。再生ボタンにデバッグ アイコンが表示されている場合は、ドロップダウン メニューから項目を選択する代わりに、再生ボタンを直接選択してデバッグできます。
デバッガーを探索する
コードのステップ実行を開始する前に、ユーザーインターフェイスのいくつかの変更点に注目しましょう。
-
ソースコードエディターの下部に統合ターミナルが表示されます。[デバッグ コンソール] タブには、デバッガが起動して実行中であることを示す出力が表示されます。
-
エディターは、デバッガを開始する前にブレークポイントを設定した行をハイライト表示します。

-
アクティビティバーの [実行とデバッグ] ビューに、デバッグ情報が表示されます。
-
コードエディタの上部に、デバッグ コントロール パネルが表示されます。左側のドットをつかんで画面上を移動させることができます。

コードをステップ実行する
これで、コードのステップ実行を開始する準備ができました。
-
デバッグ制御パネルの [ステップ オーバー] アイコンを選択し、
for (const string& word : msg)ステートメントをハイライトします。
[ステップ オーバー] コマンドは、
msg変数が作成および初期化されるときに呼び出される、vectorおよびstringクラス内のすべての内部関数呼び出しをスキップします。[変数] ウィンドウの変化に注目してください。そのステートメントが完了したため、msgの内容が表示されます。 -
もう一度 [ステップ オーバー] を押して、次のステートメントに進みます(ループを初期化するために実行されるすべての内部コードはスキップされます)。これで、[変数] ウィンドウにループ変数に関する情報が表示されます。
-
もう一度 [ステップ オーバー] を押して、
coutステートメントを実行します。 -
必要に応じて、ベクターのすべての単語がコンソールに出力されるまで **ステップ オーバー** を押し続けることができます。しかし、興味がある場合は、**ステップ イン** ボタンを押して、C++ 標準ライブラリのソース コードをステップ実行してみてください。
ウォッチを設定する
プログラムの実行中に、変数の値を追跡したい場合があります。これは、変数にウォッチ式を設定することで実行できます。
-
[ウォッチ式] ウィンドウでプラス記号を選択し、テキストボックスに
wordと入力します。これはループ変数の名前です。ここで、ループをステップ実行しながら [ウォッチ式] ウィンドウを確認します。
注意: ウォッチ変数の値は、プログラムの実行がその変数のスコープ内にある場合のみ利用可能です。たとえば、ループ変数の場合、プログラムがループを実行している間のみ値が表示されます。
-
ループの前に次のステートメントを追加して、別のウォッチを追加します:
int i = 0;。次に、ループ内で次のステートメントを追加します:++i;。次に、前のステップで同様にiのウォッチを追加します。 -
一時停止中にマウスポインターを任意の変数の上に置くと、その値をすばやく確認できます。

launch.json でデバッグをカスタマイズする
再生ボタンまたは F5 でデバッグすると、C++ 拡張機能は動的なデバッグ構成をオンザフライで作成します。
デバッグ構成をカスタマイズしたい場合があります。たとえば、実行時にプログラムに渡す引数を指定するなどです。カスタム デバッグ構成は、launch.json ファイルで定義できます。
launch.json を作成するには、再生ボタンのドロップダウン メニューから **デバッグ構成の追加** を選択します。

次に、事前定義されたさまざまなデバッグ構成のドロップダウンが表示されます。[C/C++: clang++ build and debug active file] を選択します。
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 を表示します。

これにより、[C/C++ 構成] ページが開きます。

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 _main や、attempting to link with file built for unknown-unsupported file format など)の原因は、ビルドの開始時やデバッグの開始時に helloworld.cpp がアクティブなファイルになっていないことです。これは、コンパイラが launch.json、tasks.json、または c_cpp_properties.json ファイルなどのソースコードではないものをコンパイルしようとするためです。
ビルドエラーで「C++11 extensions」について言及されている場合、tasks.json のビルドタスクが clang++ の引数 --std=c++17 を使用するように更新されていない可能性があります。デフォルトでは、 clang++ は C++98 標準を使用しますが、これでは helloworld.cpp で使用されている初期化をサポートしていません。tasks.json ファイルの内容全体を、Run 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": []
}
この特定のタスクを実行するには、[ターミナル] > [タスクの実行...] を選択し、[Open Terminal] を選択します。
アクセス許可の要求を承認すると、デバッグ時、外部コンソールが表示されるようになります。
次のステップ
- VS Code ユーザーガイドを探索します。
- C++ 拡張機能の概要を確認する
- 新しいワークスペースを作成し、.json ファイルをそこにコピーし、新しいワークスペース パス、プログラム名などの必要な設定を調整して、コーディングを開始してください。