VS CodeでC/C++のcompilerPath設定を完全理解:
settings.json・tasks.json・launch.jsonの役割差とGCC/Clang/MSVCの切替実践ガイド
Visual Studio Code(VS Code)でC/C++開発を始めると、compilerPathやビルド/デバッグ設定の置き場所に迷いがちです。本記事では、settings.json・tasks.json・launch.jsonの3ファイルの役割を整理し、C/C++拡張による自動検出の仕組み、そしてGCC/Clang/MSVCを状況に応じて切り替えるための超実践テンプレートをまとめて解説します。Windows/WSL/Linux/macOSいずれの開発環境でもすぐに流用できるよう、具体的なコード例と運用ノウハウをふんだんに盛り込みました。
要点の先出し:よくある疑問と結論
質問概要
- settings.json/tasks.json/launch.jsonに出てくる
compilerPathは、それぞれ何に使われるの? - 拡張機能がファイルを自動生成するとき、コンパイラのパスはどう決まるの?
- ビルドやデバッグのたびに、使うコンパイラを毎回選びたい。どうすればいい?
<h3>回答・解決策(役割の違い)</h3>
<div style="overflow-x:auto">
<table>
<thead>
<tr>
<th>ファイル</th>
<th>役割</th>
<th>影響範囲</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>settings.json</strong></td>
<td><code>C_Cpp.default.compilerPath</code>(または<code>intelliSenseMode</code>)で<strong>IntelliSense専用の参照コンパイラ</strong>を指定。ヘッダ探索・マクロの定義・言語規格の解釈など解析品質の向上に効く。ここは<strong>ビルドには使われない</strong>。</td>
<td>編集体験(補完・波線・型解決)</td>
</tr>
<tr>
<td><strong>tasks.json</strong></td>
<td><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>B</kbd> で実行される<strong>ビルドタスク</strong>を定義。<code>command</code>に<code>gcc</code>/<code>clang</code>/<code>cl.exe</code>など<strong>実ビルドで使うコンパイラ</strong>と引数を書く。</td>
<td>コンパイル(ビルド生成物)</td>
</tr>
<tr>
<td><strong>launch.json</strong></td>
<td><strong>デバッグ設定</strong>を記述。通常は<code>preLaunchTask</code>で<code>tasks.json</code>のビルドタスクを呼び出し、その出力バイナリをデバッガに渡す。<code>compilerPath</code>を直接書くことはほぼないが、<code>miDebuggerPath</code>や<code>MIMode</code>(gdb/lldb)・<code>cppvsdbg</code>の選択は重要。</td>
<td>デバッグ(ブレークポイント・変数監視)</td>
</tr>
</tbody>
</table>
</div>
<h3>自動生成時のパス決定ロジック(拡張機能の挙動)</h3>
<ol>
<li>C/C++拡張は起動時に<strong>PATH</strong>や既知のインストール場所を走査し、<code>gcc</code>・<code>g++</code>・<code>clang</code>・<code>clang++</code>・<code>cl.exe</code>などを検出。</li>
<li>最初に見つかった候補を既定値としてテンプレートに反映(<code>tasks.json</code>/<code>launch.json</code>の雛形)。</li>
<li>ワークスペースやユーザーの<code>settings.json</code>で<code>C_Cpp.default.compilerPath</code>が設定済みなら、その値が<strong>IntelliSense</strong>の基準として優先。</li>
</ol>
<p><strong>WindowsでMSVC(cl.exe)を使う場合</strong>は、コンパイラのヘッダパスやライブラリの環境変数を整えた<strong>「Developer Command Prompt」または「x64 Native Tools コマンド プロンプト」</strong>からVS Codeを起動すると、検出が確実でビルドも安定します。</p>
毎回コンパイラを選択する4つの方法(最小から本格まで)
方法1:IntelliSenseの選択ダイアログを活かす
- ワークスペースの
.vscode/settings.jsonからC_Cpp.default.compilerPathを削除。 - 初回の解析やファイルオープン時に、拡張機能が「参照に使うコンパイラ」を尋ねるダイアログを表示。ここで都度選択。
ポイント:これは編集体験に効く選択であり、ビルドやデバッグの実際のコンパイラは次項のタスク/起動設定で決まります。
<h3>方法2:複数ビルドタスクを用意してタスク選択で切り替え</h3>
<p>最もシンプルかつ堅牢。<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>B</kbd>→目的のタスク(=コンパイラ)を選ぶだけ。</p>
{
// .vscode/tasks.json
"version": "2.0.0",
"tasks": [
{
"label": "build:gcc",
"type": "shell",
"command": "/usr/bin/g++",
"args": ["-std=c++17", "-O0", "-g", "src/main.cpp", "-o", "build/app_gcc"],
"group": { "kind": "build", "isDefault": false },
"problemMatcher": ["$gcc"]
},
{
"label": "build:clang",
"type": "shell",
"command": "/usr/bin/clang++",
"args": ["-std=c++17", "-O0", "-g", "src/main.cpp", "-o", "build/app_clang"],
"group": "build",
"problemMatcher": ["$gcc"]
},
{
"label": "build:msvc",
"type": "shell",
"windows": {
// Developer Command Prompt もしくは vcvars 呼び出しが前提
"command": "cl.exe",
"args": ["/std:c++17", "/Zi", "/EHsc", "src\\main.cpp", "/Fe:build\\app_msvc.exe"]
},
"group": "build",
"problemMatcher": ["$msCompile"]
}
]
}
<h3>方法3:タスクの <code>inputs</code> で“その場選択”</h3>
<p>ビルド実行のたびに候補リストからコンパイラを選ぶ方式。メンバー全員が同じテンプレートを共有しやすく、<strong>環境差</strong>を吸収できます。</p>
{
// .vscode/tasks.json
"version": "2.0.0",
"inputs": [
{
"id": "compiler",
"type": "pickString",
"description": "使用するコンパイラを選択",
"options": [
"/usr/bin/g++",
"/usr/bin/clang++",
"C:\\\\msys64\\\\mingw64\\\\bin\\\\g++.exe",
"cl.exe"
]
}
],
"tasks": [
{
"label": "build:pick",
"type": "shell",
"command": "${input:compiler}",
"args": [
"-std=c++20", "-O0", "-g",
"src/main.cpp",
"-o", "build/app"
],
"group": { "kind": "build", "isDefault": true },
"problemMatcher": ["$gcc", "$msCompile"]
}
]
}
<p><strong>cl.exe</strong>を選ぶ可能性があるなら、VS CodeをDeveloper Command Promptから起動するか、次の「方法4」で環境設定を自動化しましょう。</p>
<h3>方法4:CMake Tools/Makefile Toolsなど拡張でワンセット切替</h3>
<ul>
<li><strong>CMake Tools</strong>:<em>Kit</em>の概念でGCC/Clang/MSVCを切り替え。<code>preLaunchTask</code>・デバッガ・IntelliSense(<code>compile_commands.json</code>)まで一気通貫。</li>
<li><strong>Makefile Tools・meson-vscode</strong>など:ビルドシステムに合わせて最適なコンパイラを自動選択し、引数も同期。</li>
</ul>
環境別・即使えるテンプレート集
Linux/WSL/macOS:GCC/Clang + gdb/lldb
まずは最小構成。build/配下に成果物を吐き出し、gdb/lldbで起動します。
{
// .vscode/settings.json
"C_Cpp.default.compilerPath": "/usr/bin/g++",
"C_Cpp.default.intelliSenseMode": "gcc-x64",
"C_Cpp.default.cppStandard": "c++17",
"C_Cpp.default.cStandard": "c17"
}
{
// .vscode/tasks.json
"version": "2.0.0",
"tasks": [
{
"label": "build:gcc-debug",
"type": "shell",
"command": "/usr/bin/g++",
"args": ["-std=c++17", "-g", "-O0", "src/main.cpp", "-o", "build/app"],
"group": { "kind": "build", "isDefault": true },
"problemMatcher": ["$gcc"]
}
]
}
{
// .vscode/launch.json
"version": "0.2.0",
"configurations": [
{
"name": "Debug (gdb)",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/app",
"args": [],
"cwd": "${workspaceFolder}",
"stopAtEntry": false,
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb",
"preLaunchTask": "build:gcc-debug",
"console": "integratedTerminal"
}
]
}
macOSでClangを使う場合は、settings.jsonのintelliSenseModeをclang-x64に、デバッガをlldbに切り替えます。
<h3>Windows:MinGW-w64(MSYS2) + gdb</h3>
{
// .vscode/settings.json
"C_Cpp.default.compilerPath": "C:/msys64/mingw64/bin/g++.exe",
"C_Cpp.default.intelliSenseMode": "gcc-x64",
"C_Cpp.default.cppStandard": "c++20"
}
{
// .vscode/tasks.json
"version": "2.0.0",
"tasks": [
{
"label": "build:mingw",
"type": "shell",
"command": "C:/msys64/mingw64/bin/g++.exe",
"args": [
"-std=c++20", "-O0", "-g",
"src/main.cpp",
"-o", "build/app_mingw.exe"
],
"options": { "cwd": "${workspaceFolder}" },
"problemMatcher": ["$gcc"],
"group": "build"
}
]
}
{
// .vscode/launch.json
"version": "0.2.0",
"configurations": [
{
"name": "Debug (gdb / MinGW)",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/app_mingw.exe",
"cwd": "${workspaceFolder}",
"MIMode": "gdb",
"miDebuggerPath": "C:/msys64/mingw64/bin/gdb.exe",
"preLaunchTask": "build:mingw",
"console": "integratedTerminal"
}
]
}
<h3>Windows:MSVC(cl.exe) + Visual Studio Windows Debugger(cppvsdbg)</h3>
<p><strong>vcvars</strong>(環境初期化)をタスクで自動実行してからビルドするテンプレートです。VS Codeは通常のコマンドプロンプトで起動してOK。</p>
{
// .vscode/settings.json
"C_Cpp.default.compilerPath": "C:/Program Files/Microsoft Visual Studio/2022/BuildTools/VC/Tools/MSVC/<バージョン>/bin/Hostx64/x64/cl.exe",
"C_Cpp.default.intelliSenseMode": "msvc-x64",
"C_Cpp.default.cppStandard": "c++20"
}
{
// .vscode/tasks.json
"version": "2.0.0",
"tasks": [
{
"label": "env:vcvars64",
"type": "shell",
"windows": {
"command": "cmd.exe",
"args": ["/C", "\"call \"%ProgramFiles(x86)%\\Microsoft Visual Studio\\2022\\BuildTools\\VC\\Auxiliary\\Build\\vcvars64.bat\" && set\""],
"options": { "cwd": "${workspaceFolder}" }
},
"problemMatcher": []
},
{
"label": "build:msvc",
"type": "shell",
"dependsOn": "env:vcvars64",
"windows": {
"command": "cmd.exe",
"args": ["/C", "\"cl.exe /std:c++20 /Zi /EHsc src\\main.cpp /Fe:build\\app_msvc.exe\""]
},
"group": { "kind": "build", "isDefault": true },
"problemMatcher": ["$msCompile"]
}
]
}
{
// .vscode/launch.json
"version": "0.2.0",
"configurations": [
{
"name": "Debug (MSVC / cppvsdbg)",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/build/app_msvc.exe",
"args": [],
"cwd": "${workspaceFolder}",
"preLaunchTask": "build:msvc",
"console": "integratedTerminal",
"stopAtEntry": false
}
]
}
<p><em>ヒント</em>:<code>clang-cl.exe</code>を使う場合は<code>compilerPath</code>をそのフルパスに、<code>intelliSenseMode</code>はMSVC系(例:<code>msvc-x64</code>)を選ぶとヘッダ解決の整合性が取りやすくなります。</p>
IntelliSenseの正確さを最大化する設定ポイント
- compilerPathを必ずフルパス指定:紛らわしい同名バイナリ(例:複数のMinGW)がPATHにあると誤検出が起きやすい。
- intelliSenseModeを明示:
gcc-x64/clang-x64/msvc-x64など、実際のツールチェーンに合わせる。 - 言語規格:
cStandard(例:c17)・cppStandard(例:c++20)を明示。 - compile_commands.jsonの活用:CMakeやMesonで出力される
compile_commands.jsonをC_Cpp.default.compileCommandsに設定すると、実ビルドと同じフラグ・定義で解析され、誤検知が激減。 - includePathは最小限に:
compilerPathとcompileCommandsで足りるなら、手動のincludePathは不要。重複定義は混乱のもと。
{
// .vscode/settings.json(解析の黄金パターン)
"C_Cpp.default.compilerPath": "/usr/bin/clang++",
"C_Cpp.default.intelliSenseMode": "clang-x64",
"C_Cpp.default.cppStandard": "c++20",
"C_Cpp.default.compileCommands": "${workspaceFolder}/build/compile_commands.json"
}
launch.jsonのキモ:デバッガ種別とパスの整合
| ツールチェーン | デバッガ設定 | 主なキー | 注意点 |
|---|---|---|---|
| GCC(Linux/WSL/MinGW) | type: "cppdbg" / MIMode: "gdb" | miDebuggerPath=gdbのパス | MinGWとCygwinのgdbは混ぜない。実行ファイルとgdbのABIが合うこと。 |
| Clang(macOS) | type: "cppdbg" / MIMode: "lldb" | miDebuggerPath=lldb | 権限やSIPの影響で最初のアタッチに承認が必要な場合あり。 |
| MSVC(Windows) | type: "cppvsdbg" | 特別なキーは少ない | シンボル生成オプション(/Zi)をビルドに入れる。vcvars済み環境が安定。 |
| clang-cl(Windows) | MSVCと同様にcppvsdbgが使いやすい | — | ランタイムがMSVC寄りになるため、gdbよりcppvsdbgの方が快適。 |
よくあるトラブルと対処集(原因別チェックリスト)
「ビルドは通るのに、IntelliSenseの波線が消えない」
- 解析用コンパイラ(
settings.jsonのcompilerPath)と実ビルド(tasks.json)の食い違いを確認。 intelliSenseModeと実ツールチェーンを一致させる。compile_commands.jsonを使えるなら導入して同期。
<h3>「別のMinGWが勝手に使われる/gdbが動かない」</h3>
<ul>
<li><code>compilerPath</code>・<code>gdb</code>の<strong>フルパス指定</strong>で固定。</li>
<li>環境変数<strong>PATH</strong>の並び順を見直し。古いMinGWを除外。</li>
<li>MinGW版とCygwin版のgdbは混ぜない(実行ファイルとgdbは同系列)。</li>
</ul>
<h3>「Windowsでcl.exeが見つからない/ヘッダが解決しない」</h3>
<ul>
<li>Developer Command PromptからVS Codeを起動(環境変数が整う)。</li>
<li>もしくは本稿の<em>vcvars呼び出しタスク</em>を導入。</li>
<li><code>intelliSenseMode</code>は<code>msvc-x64</code>等を選ぶ。</li>
</ul>
<h3>「launch.jsonでデバッガが止まる/プロセスが見つからない」</h3>
<ul>
<li><code>program</code>のパスがビルド成果物と一致しているか。</li>
<li><code>preLaunchTask</code>が正しく成功しているか。</li>
<li><code>externalConsole</code>/<code>console</code>の指定(統合ターミナルか外部コンソールか)を用途に合わせて調整。</li>
</ul>
<h3>「WSLとWindowsを取り違える」</h3>
<ul>
<li>WSLで開いたフォルダは<strong>WSL内</strong>のコンパイラ・gdbを使う(パスは<code>/usr/bin/...</code>)。</li>
<li>Windows側のMinGWやMSVCと混ぜない。Remote拡張の接続先を確認。</li>
</ul>
“編集・ビルド・デバッグ”を同期させる設計パターン
- 編集(IntelliSense):
settings.jsonにcompilerPath・intelliSenseMode・規格を明示。可能ならcompile_commands.jsonでビルドの実態を反映。 - ビルド:
tasks.jsonにコンパイラごとのタスクを用意。inputsによる選択式や、dependsOnで環境初期化タスクを連鎖。 - デバッグ:
launch.jsonでpreLaunchTaskを指し、デバッガ種別(gdb/lldb/cppvsdbg)を正しく選ぶ。
この三層を分離しつつ連携させるのが、混乱を防ぐ最短ルートです。
より深く:設定の拡張とチーム開発のベストプラクティス
ユーザー設定 vs ワークスペース設定
- ユーザー設定(グローバル)に
compilerPathを書いた場合:新規プロジェクトの初期値として便利。ただしチーム開発では環境差が出やすい。 - ワークスペース設定(
.vscode/settings.json)に限定:プロジェクト単位でコンパイラを固定でき、再現性が高い。
<h3>問題マッチャー(problemMatcher)でエラー表示を整える</h3>
<p>コンパイラの種類に合わせて、<code>$gcc</code>/<code>$msCompile</code>などを設定。独自のビルドスクリプトでも正確にエラー行へジャンプできます。</p>
<h3>タスクの変数と条件分岐</h3>
{
// OSごとに切り替える例
"tasks": [
{
"label": "build:auto",
"type": "shell",
"linux": { "command": "/usr/bin/g++" },
"osx": { "command": "/usr/bin/clang++" },
"windows": { "command": "C:/msys64/mingw64/bin/g++.exe" },
"args": ["-g", "src/main.cpp", "-o", "build/app"]
}
]
}
<h3>コンパイルオプションの管理</h3>
<p>デバッグとリリースでフラグを分けるのは基本です。タスクを二つに分け、<code>-O0 -g</code>と<code>-O2 -DNDEBUG</code>などを切り替えましょう。</p>
<h3>ABI・ランタイムの整合</h3>
<ul>
<li><strong>MinGW</strong>と<strong>MSVC</strong>で生成したライブラリの混用は避ける。</li>
<li><strong>clang-cl</strong>はMSVC互換のフロントエンド。IntelliSenseはMSVCモードと親和性が高い。</li>
<li><strong>WSL</strong>の成果物はLinuxバイナリ。Windowsネイティブとは別物。</li>
</ul>
“毎回選ぶ”をもっとスマートに:高度な切り替え術
1)ビルド前にコンパイラ選択ダイアログを出す(入力統合)
inputsと変数を応用し、preLaunchTaskからも選択を共有します。
{
// .vscode/tasks.json(コンパイラ選択を1回で共有)
"version": "2.0.0",
"inputs": [
{
"id": "cc",
"type": "pickString",
"description": "コンパイラを選択",
"options": [
"/usr/bin/g++",
"/usr/bin/clang++",
"C:/msys64/mingw64/bin/g++.exe",
"cl.exe"
]
}
],
"tasks": [
{
"label": "build:smart",
"type": "shell",
"command": "${input:cc}",
"args": ["-std=c++20", "-g", "src/main.cpp", "-o", "build/app_smart"],
"problemMatcher": ["$gcc", "$msCompile"],
"group": "build"
}
]
}
{
// .vscode/launch.json(preLaunchTaskと同じ入力が再利用される)
"version": "0.2.0",
"configurations": [
{
"name": "Debug (smart)",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/app_smart",
"cwd": "${workspaceFolder}",
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb",
"preLaunchTask": "build:smart"
}
]
}
Windowsでcl.exeを選ぶ可能性がある場合、build:smartの前段にvcvars実行タスクをdependsOnで繋げることで安定動作します。
<h3>2)CMake Toolsで<strong>キット(Kit)</strong>選択</h3>
<p>プロジェクトがCMakeなら、<em>Kit</em>でコンパイラを切り替え、<code>compile_commands.json</code>も自動生成。IntelliSense・ビルド・デバッグが常に同期します。チームでの再現性が最も高い方式です。</p>
<h3>3)Makefile Tools/Meson拡張の活用</h3>
<p>既存のMakefileやMesonプロジェクトでは、拡張がターゲットやコンパイラを自動認識。<code>make CC=clang</code>のような切り替えもUIから行えます。</p>
サンプルプロジェクト:最小のC++アプリで全体像を掴む
ディレクトリ構造
your-project/
├─ .vscode/
│ ├─ settings.json
│ ├─ tasks.json
│ └─ launch.json
├─ src/
│ └─ main.cpp
└─ build/ // 生成物を置く
<h3>main.cpp</h3>
#include <iostream>
int main() {
std::cout << "Hello, VS Code C++!" << std::endl;
return 0;
}
<h3>操作手順</h3>
<ol>
<li>コマンドパレットから<strong>「C/C++: Select IntelliSense Configuration」</strong>を実行し、参照用コンパイラ(<em>settings.json</em>の<code>compilerPath</code>)を選択。</li>
<li><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>B</kbd>でビルドタスクを実行(テンプレートに応じてコンパイラを選択)。</li>
<li>F5でデバッグ開始。<code>preLaunchTask</code>が走り、成果物を指定のデバッガで起動。</li>
</ol>
<p>これで<strong>編集(IntelliSense)→ビルド→デバッグ</strong>の一連の流れが明確になります。</p>
OS別の要点まとめ
| OS | 推奨コンパイラ | デバッガ | compilerPath例 | 注意点 |
|---|---|---|---|---|
| Windows | MSVC / MinGW-w64 / clang-cl | cppvsdbg / gdb | MSVC:.../cl.exeMinGW: C:/msys64/mingw64/bin/g++.exe | vcvars初期化・複数MinGWの混在・改行コードとパス区切りを意識。 |
| WSL | GCC / Clang | gdb / lldb | /usr/bin/g++ / /usr/bin/clang++ | WSL側のファイルシステムでビルド。Windowsのgdb等とは混ぜない。 |
| Linux | GCC / Clang | gdb / lldb | /usr/bin/g++ / /usr/bin/clang++ | ディストリごとのツールチェーン差(libstdc++のバージョン等)に注意。 |
| macOS | Clang | lldb | /usr/bin/clang++ | 初回のデバッグで権限ダイアログが出る場合がある。 |
さらに使いこなす:応用Tips
- ビルド出力の分離:
build/の下にgcc/clang/msvcなどサブディレクトリを作り、複数成果物を共存。「切り替え検証」に便利。 - タスクのチェーン:
dependsOnでコード生成→ビルド→テスト→パッケージの順に自動化。 - 環境ファイル:
.envに定義した変数を${env:VAR}としてtasks.jsonやlaunch.jsonで参照。プロキシや追加ライブラリパスに有効。 - デバッガ拡張コマンド:gdbの
pretty printers設定はsetupCommandsに書いておくと毎回適用される。 - マルチルートワークスペース:ルートごとに
.vscode/を持たせ、異なるコンパイラ・規格を共存させる。 - CIとの整合:ローカルの
tasks.jsonとCIのビルドコマンドを合わせると、リリース前検証が容易。
まとめ:混乱しない思考法
VS CodeのC/C++開発は、編集(IntelliSense)・ビルド・デバッグという三層を分けて捉えると整理できます。IntelliSenseはsettings.jsonで「何を参照するか」を決め、ビルドはtasks.jsonで「何を実行するか」を決め、デバッグはlaunch.jsonで「どう起動するか」を決める。
この原則さえ押さえれば、GCC/Clang/MSVCを自由自在に切り替えつつ、再現性の高い開発体験を全員で共有できます。迷ったときは、compilerPathは解析用、commandはビルド用、デバッガ種別は実行時の相棒——この3点を思い出してください。
付録:具体的な設定スニペット集
GCCとClangを同居させる(成果物名で識別)
{
"version": "2.0.0",
"tasks": [
{
"label": "build:gcc-out",
"type": "shell",
"command": "/usr/bin/g++",
"args": ["-g", "-O0", "src/main.cpp", "-o", "build/gcc/app"],
"group": "build",
"problemMatcher": ["$gcc"]
},
{
"label": "build:clang-out",
"type": "shell",
"command": "/usr/bin/clang++",
"args": ["-g", "-O0", "src/main.cpp", "-o", "build/clang/app"],
"group": "build",
"problemMatcher": ["$gcc"]
}
]
}
<h3>gdbに便利な設定</h3>
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug (gdb, pretty)",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/app",
"cwd": "${workspaceFolder}",
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb",
"setupCommands": [
{ "text": "-enable-pretty-printing" },
{ "text": "handle SIGPIPE nostop noprint pass" }
],
"preLaunchTask": "build:gcc-debug"
}
]
}
<h3>clang-cl(MSVCランタイム)</h3>
{
"C_Cpp.default.compilerPath": "C:/Program Files/LLVM/bin/clang-cl.exe",
"C_Cpp.default.intelliSenseMode": "msvc-x64",
"C_Cpp.default.cppStandard": "c++20"
}
FAQ:細かいけれど効く知見
Q. c_cpp_properties.jsonは使わないの? A. 最近はC_Cpp.default.*をsettings.jsonに置く流れが主流。既存プロジェクトでc_cpp_properties.jsonがあっても共存は可能ですが、重複設定は避けてください。
<dt>Q. <code>compilerPath</code>と<code>includePath</code>の関係は?</dt>
<dd>A. <code>compilerPath</code>が分かれば、拡張が標準インクルードの探索経路や定義済みマクロを推定できます。手動の<code>includePath</code>は最小限に。</dd>
<dt>Q. <code>gnu++2x</code>や<code>c++23</code>を使いたい</dt>
<dd>A. <code>cppStandard</code>に<code>c++23</code>(または利用可能な最新)を設定し、ビルド側の<code>-std=</code>オプションと揃えてください。</dd>
<dt>Q. <code>clang</code>と<code>clang-cl</code>の違いは?</dt>
<dd>A. <code>clang</code>/<code>clang++</code>はGCC互換のコマンドライン、<code>clang-cl</code>はMSVC互換のフロントエンド。WindowsでMSVCのエコシステムに寄せたいなら<code>clang-cl</code>が便利です。</dd>
<dt>Q. <code>cppdbg</code>と<code>cppvsdbg</code>の違いは?</dt>
<dd>A. <code>cppdbg</code>はMI(gdb/lldb)プロトコル系、<code>cppvsdbg</code>はVisual StudioのWindowsデバッガ。MSVCやclang-clでのWindowsネイティブデバッグには<code>cppvsdbg</code>が快適です。</dd>
</dl>
実運用のチェックリスト(コピペ可)
- [ ] 参照用コンパイラ:
settings.jsonのC_Cpp.default.compilerPathをフルパスで固定したか? - [ ] 解析モード:
intelliSenseMode(gcc/clang/msvc)を実ツールチェーンと一致させたか? - [ ] ビルド:
tasks.jsonに複数タスク orinputs選択を用意したか? - [ ] デバッグ:
launch.jsonで正しいデバッガ(gdb/lldb/cppvsdbg)を選んだか? - [ ] WindowsのMSVC:Developer Prompt起動 or vcvarsタスクで初期化しているか?
- [ ] compile_commands.json:ビルドとIntelliSenseの同期に使えるなら設定したか?
- [ ] PATH汚染回避:同名コンパイラが複数あるならフルパス指定で封じたか?
結論:compilerPathは“解析の舵取り役”、ビルドはタスクが本番
本記事で示した通り、compilerPathはIntelliSenseの精度に直結する「参照用コンパイラ」の宣言であり、実際のビルドはtasks.jsonのcommandで決まります。launch.jsonはその成果物をどうデバッグするかの仕様を司り、preLaunchTaskでビルドと連動します。
この三位一体の設計を理解すれば、GCC/Clang/MSVCをプロジェクトや用途ごとに柔軟に切り替えながら、ストレスの少ないC/C++開発を実現できます。

コメント