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

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にします。

次のソースコードを貼り付けます。
#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)) を開き、IntelliSense の構成を選択と入力します。コンパイラのドロップダウンから Use clang++ を選択して構成します。詳細については、IntelliSense 構成ドキュメントを参照してください。
helloworld.cpp を実行する
C++ 拡張機能は、マシンにインストールした C++ コンパイラを使用してプログラムをビルドすることに注意してください。VS Code で helloworld.cpp を実行してデバッグする前に、Clang などの C++ コンパイラがインストールされていることを確認してください。
-
helloworld.cppをアクティブ ファイルとして開きます。 -
エディターの右上隅にある再生ボタンを押します。

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

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

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

-
システムで検出されたコンパイラのリストからC/C++: clang++ アクティブファイルのビルドとデバッグを選択します (
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++ アクティブファイルのビルドとデバッグを選択します。
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 ファイルのすべての内容を、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 ファイルをコピーし、新しいワークスペース パス、プログラム名などの必要な設定を調整して、コーディングを開始しましょう!