Visual Studio Code(VSCode)は、C++の開発にも利用できる人気のコードエディタです。
ただし、VSCodeをインストールしただけではC++のプログラムをコンパイルしたり実行したりすることはできません。
C++をVSCodeで開発するには、VSCode本体に加えて、C++用の拡張機能やコンパイラなどを準備する必要があります。
基本的には、次の3つを用意します。
- Visual Studio Code
- MicrosoftのC/C++拡張機能
- GCC・Clang・MSVCなどのC++コンパイラ
環境を正しく構築すれば、VSCode上でコードの作成だけでなく、コンパイル、実行、コード補完、デバッグまで行えます。
VSCodeでC++を開発するために必要なもの
Visual Studio Code
まず必要なのがVisual Studio Codeです。
VSCodeはMicrosoftが提供しているコードエディタで、Windows、macOS、Linuxに対応しています。
C++専用のIDEではありませんが、拡張機能を追加することでC++の開発環境として利用できます。
開発を始める際は、単体のファイルだけを開くよりも、プロジェクト用のフォルダを作成してVSCodeで開く方法がおすすめです。
たとえば、次のような構成にします。
cpp-project/
└── main.cpp
プロジェクトフォルダ単位で管理すると、後からビルド設定やデバッグ設定を追加しやすくなります。
C/C++拡張機能
VSCodeでC++を扱う場合は、Microsoftが提供している「C/C++」拡張機能をインストールします。
VSCodeの「Extensions」から「C++」と検索すると見つけられます。
C/C++拡張機能を導入すると、主に次のような機能を利用できます。
- シンタックスハイライト
- IntelliSenseによるコード補完
- 関数や変数の情報表示
- コードナビゲーション
- エラー表示
- デバッガとの連携
- ビルド機能との連携
ただし、C/C++拡張機能そのものにC++コンパイラが含まれているわけではありません。
実際にC++プログラムをコンパイルするには、別途コンパイラをインストールする必要があります。
C++コンパイラ
C++はコンパイル型のプログラミング言語です。
そのため、main.cppなどのソースコードを書いただけでは、そのまま実行することはできません。
GCC、Clang、MSVCなどのコンパイラを使用して、実行可能な形式へ変換する必要があります。
利用するコンパイラは、OSや開発目的によって異なります。
WindowsでC++の開発環境を構築する方法
Windowsでは、主にMSVCまたはMinGW-w64系のGCCを利用できます。
MSVCを利用する場合
MSVCはMicrosoftが提供するC/C++コンパイラです。
Windows向けのアプリケーション開発や、Microsoftの開発環境との親和性を重視する場合に適しています。
MSVCを利用する場合は、Visual StudioまたはVisual Studio Build ToolsからC++開発用のツールをインストールします。
一般的には、「Desktop development with C++」に相当するC++開発環境を選択します。
これにより、MSVCコンパイラやWindows SDKなどを導入できます。
インストール後は、Developer Command Promptなどから次のコマンドを実行します。
cl
コンパイラの情報が表示されれば、MSVCが利用できる状態です。
MSVCでは、必要な環境変数を読み込んだターミナルからVSCodeを起動することがあります。
たとえば、Developer Command Promptで次のように実行します。
code .
なお、環境を適切に設定すれば、必ずしも毎回Developer Command PromptからVSCodeを起動しなければならないわけではありません。
MinGW-w64系のGCCを利用する場合
Windows上でGCCを使いたい場合は、MinGW-w64系の環境を利用できます。
C++をコンパイルするときには、一般的にg++コマンドを使用します。
インストール後、VSCodeのターミナルなどで次のコマンドを実行します。
g++ --version
バージョン情報が表示されれば、g++を利用できます。
なお、GCCは「GNU Compiler Collection」の名称であり、C++のコンパイルで一般的に使用するコンパイラドライバがg++です。
macOSでC++の開発環境を構築する方法
macOSでは、Clangを利用する方法が一般的です。
Clangが利用できるか確認する
ターミナルで次のコマンドを実行します。
clang++ --version
バージョン情報が表示されれば、C++のコンパイルに利用できます。
Clangがインストールされていない場合は、AppleのCommand Line Toolsが必要になることがあります。
C++ファイルをコンパイルする場合は、次のように実行できます。
clang++ main.cpp -o main
その後、次のコマンドで実行します。
./main
LinuxでC++の開発環境を構築する方法
LinuxではGCCを利用する方法が一般的です。
g++が利用できるか確認する
ターミナルで次のコマンドを実行します。
g++ --version
バージョン情報が表示されれば、C++の開発に利用できます。
インストールされていない場合は、利用しているLinuxディストリビューションのパッケージ管理システムからGCCやG++を導入します。
VSCodeでC++ファイルを作成する
開発環境が整ったら、C++のソースファイルを作成します。
たとえば、main.cppというファイルを作成し、次のコードを入力します。
#include <iostream>
int main()
{
std::cout << "Hello, World!" << std::endl;
return 0;
}
このプログラムを実行すると、次のように表示されます。
Hello, World!
main関数とは
C++では、通常main関数がプログラムの実行開始点として扱われます。
int main()
は、int型の値を返すmain関数を定義しています。
また、次の記述はプログラムが正常終了したことを示します。
return 0;
ただし、C++ではmain関数の末尾まで到達した場合、return 0;を省略しても正常終了として扱われます。
そのため、次のように書くこともできます。
int main()
{
std::cout << "Hello, World!" << std::endl;
}
ターミナルからC++をコンパイルする方法
GCCのg++を使用する場合は、次のようにコンパイルします。
g++ main.cpp -o main
それぞれの意味は次の通りです。
g++ C++のコンパイルに使用するコマンド
main.cpp コンパイルするソースファイル
-o main 出力する実行ファイル名
一般的には「コンパイルする」と表現されますが、実際にはこのコマンドによってコンパイルやリンクなどの処理が行われ、実行ファイルが生成されます。
Windowsで実行する
Windowsでは、出力された実行ファイルを次のように実行できます。
.\main.exe
macOSやLinuxで実行する
macOSやLinuxでは次のように実行します。
./main
C++のバージョンを指定してコンパイルする
C++には、C++11、C++14、C++17、C++20、C++23などの複数の標準規格があります。
使用する機能に合わせて、コンパイル時にC++標準を指定できます。
たとえば、C++20を使用する場合は次のようにします。
g++ -std=c++20 main.cpp -o main
C++17を使用する場合は次の通りです。
g++ -std=c++17 main.cpp -o main
C++標準を明示しておくと、開発環境によるコンパイラの既定設定の違いを減らしやすくなります。
VSCodeからC++を実行する方法
C/C++拡張機能とコンパイラが正しく設定されていれば、VSCodeの実行・デバッグ機能からC++プログラムをビルドしたり実行したりできます。
初回実行時には、使用するコンパイラに対応した構成を選択する場合があります。
たとえば、GCCを使用している場合はg++、MSVCであればcl.exeに対応する構成を選択します。
ただし、表示される項目名やボタンの位置は、VSCodeや拡張機能のバージョン、OSなどによって異なることがあります。
そのため、特定の表示名だけを覚えるのではなく、現在使用しているコンパイラに対応したビルド・デバッグ構成を選ぶことが重要です。
tasks.jsonでビルド処理を設定する
VSCodeでは、.vscode/tasks.jsonを利用してビルドなどの処理をタスクとして保存できます。
たとえば、G++でC++20のプログラムをビルドする場合は、次のような設定ができます。
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C++ build",
"command": "g++",
"args": [
"-g",
"-std=c++20",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
tasks.jsonの役割
tasks.jsonでは、ビルドなどの定型作業を設定できます。
毎回次のようなコマンドを入力する必要がなくなります。
g++ -g -std=c++20 main.cpp -o main
コンパイラの種類やC++標準、コンパイルオプションなどをプロジェクトごとに統一できる点もメリットです。
launch.jsonでデバッグ設定を行う
VSCodeでは、.vscode/launch.jsonを使用してデバッグ実行の設定を管理できます。
代表的な設定項目には次のようなものがあります。
programargscwdstopAtEntrypreLaunchTask
program
programには、デバッグする実行ファイルを指定します。
args
argsには、プログラムへ渡すコマンドライン引数を指定します。
preLaunchTask
preLaunchTaskを指定すると、デバッグ開始前にtasks.jsonで定義したビルド処理を実行できます。
この仕組みを利用すれば、ビルドしてからデバッグするという一連の作業を効率化できます。
VSCodeでC++をデバッグする方法
C++プログラムで不具合が発生したときは、デバッガを使うと原因を調べやすくなります。
環境によって、主に次のようなデバッガを利用できます。
Windows:Visual Studio Windows DebuggerやGDB
Linux:GDB
macOS:LLDBやGDB
ブレークポイントを設定する
調査したい行の左側をクリックすると、ブレークポイントを設定できます。
たとえば、次のプログラムを考えます。
#include <iostream>
int main()
{
int x = 10;
int y = 20;
int result = x + y;
std::cout << result << std::endl;
return 0;
}
int result = x + y;の行などにブレークポイントを設定してデバッグを開始すると、その付近でプログラムを停止できます。
変数の値を確認する
デバッグ中は、変数の値を確認できます。
たとえば、次のような状態を確認できます。
x = 10
y = 20
result = 30
また、ステップ実行やウォッチ、コールスタックの確認なども可能です。
デバッグするときは-gオプションを使用する
GCCでデバッグする場合は、コンパイル時に-gオプションを指定します。
g++ -g main.cpp -o main
-gを指定すると、デバッガが利用するためのデバッグ情報が実行ファイルに含まれます。
デバッグをしやすくするために、最適化を抑える-O0を併用することもあります。
g++ -std=c++20 -g -O0 main.cpp -o main
最適化が有効になっていると、ソースコードと実際の実行順序や変数の状態が分かりにくくなる場合があります。
IntelliSenseを設定する
VSCodeのC/C++拡張機能では、IntelliSenseを利用できます。
IntelliSenseによって、主に次の機能を利用できます。
- コード補完
- 関数の引数表示
- 型情報の表示
- 定義への移動
- エラーや警告の表示
通常は、インストールされているコンパイラを自動検出して設定される場合があります。
正しく認識されない場合は、C/C++拡張機能の設定画面からコンパイラパスなどを調整します。
c_cpp_properties.jsonとは
IntelliSenseの設定を細かく管理する場合は、.vscode/c_cpp_properties.jsonを利用できます。
代表的な設定項目は次の通りです。
compilerPathincludePathdefinesintelliSenseModecppStandard
たとえば、Linux環境でG++を使用する場合は次のように設定できます。
{
"configurations": [
{
"name": "Default",
"compilerPath": "/usr/bin/g++",
"includePath": [
"${workspaceFolder}/**"
],
"cppStandard": "c++20"
}
],
"version": 4
}
cppStandardは実際のコンパイル設定とは別
特に注意したいのがcppStandardです。
"cppStandard": "c++20"
と設定すると、主にIntelliSenseがC++20としてソースコードを解析するために使用されます。
この設定だけで、実際のg++によるコンパイルが必ずC++20になるわけではありません。
実際のコンパイルでは、次のように-std=c++20を指定する必要があります。
g++ -std=c++20 main.cpp -o main
IntelliSenseの設定と実際のビルド設定は別物として考えることが重要です。
includePathは必要な場合に設定する
includePathは、ヘッダーファイルを検索するパスなどを指定するために使用します。
ただし、標準ライブラリのパスをむやみに手動追加する必要はありません。
まずcompilerPathが正しく設定されているか確認し、そのうえで独自のヘッダーファイルや外部ライブラリなどが認識されない場合にincludePathを調整するとよいでしょう。
複数ファイルのC++プログラムを開発する
実際のC++開発では、1つのmain.cppだけではなく、複数のソースファイルやヘッダーファイルを使用することが一般的です。
たとえば、次のような構成にできます。
cpp-project/
├── src/
│ ├── main.cpp
│ └── calculator.cpp
└── include/
└── calculator.hpp
calculator.hpp
#ifndef CALCULATOR_HPP
#define CALCULATOR_HPP
int add(int a, int b);
#endif
calculator.cpp
#include "calculator.hpp"
int add(int a, int b)
{
return a + b;
}
main.cpp
#include <iostream>
#include "calculator.hpp"
int main()
{
std::cout << add(10, 20) << std::endl;
return 0;
}
複数のCPPファイルをまとめてコンパイルする場合は、次のようにします。
g++ -std=c++20 src/main.cpp src/calculator.cpp -Iinclude -o app
-Iincludeによって、includeフォルダをヘッダーファイルの検索対象として追加しています。
Windowsで分かりやすく実行ファイル名を指定するなら、次のようにしてもよいでしょう。
g++ -std=c++20 src/main.cpp src/calculator.cpp -Iinclude -o app.exe
本格的なC++開発ではCMakeなどを利用する
小規模なプログラムであれば、g++などを直接実行してビルドしても問題ありません。
しかし、ソースファイルが増えたり、外部ライブラリを利用したりするようになると、毎回手動でコンパイルコマンドを書くのは大変になります。
そのため、本格的なC++開発ではCMakeなどのビルドシステムを利用することがあります。
CMakeを利用するメリット
CMakeを利用すると、次のような処理を管理しやすくなります。
- 複数のソースファイル
- 外部ライブラリ
- DebugビルドとReleaseビルド
- Windows、macOS、Linuxへの対応
- コンパイラオプション
- インクルードディレクトリ
- 複数の実行ファイルやライブラリ
CMakeLists.txtの例
たとえば、次のようなプロジェクトを考えます。
cpp-project/
├── CMakeLists.txt
└── src/
└── main.cpp
CMakeLists.txtは次のように記述できます。
cmake_minimum_required(VERSION 3.20)
project(MyApp)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(MyApp
src/main.cpp
)
この設定では、C++20を使用してsrc/main.cppからMyAppという実行ファイルを作成します。
CMakeはC++開発で広く利用されていますが、必須ではありません。
Make、Meson、Bazelなど、プロジェクトによって別のビルドシステムが使用される場合もあります。
Visual StudioとVSCodeの違い
「Visual Studio」と「Visual Studio Code」は名前が似ていますが、別のソフトウェアです。
Visual Studio
Visual Studioは、Microsoftが提供する統合開発環境です。
C++の開発に必要なコンパイラ、デバッガ、プロジェクト管理機能などを統合して利用できます。
Windowsで本格的なC++開発を行う場合には便利な選択肢です。
Visual Studio Code
VSCodeは、軽量で拡張性の高いコードエディタです。
C++を開発する場合は、次のようなツールを組み合わせて環境を構築します。
VSCode
+
C/C++拡張機能
+
GCC・Clang・MSVC
+
必要に応じてCMakeなど
VSCodeは自由度が高い一方で、Visual Studioと比べて最初に開発環境を構築する作業が必要になります。
VSCodeでC++を開発するときによくあるエラー
g++が見つからない
次のようなエラーが表示される場合があります。
g++: command not found
Windowsでは次のような表示になることもあります。
'g++' is not recognized
主な原因として、次のようなものがあります。
- GCCやG++がインストールされていない
- PATHが正しく設定されていない
- 環境変数の変更がVSCodeに反映されていない
まずは次のコマンドを実行します。
g++ --version
バージョン情報が表示されなければ、コンパイラのインストールやPATHの設定を確認しましょう。
PATHを変更した直後であれば、VSCodeやターミナルを再起動すると反映される場合があります。
iostreamに赤い波線が表示される
次のようなコードに赤い波線が表示される場合があります。
#include <iostream>
この場合、必ずしも実際のコンパイルエラーとは限りません。
IntelliSenseがコンパイラや標準ライブラリの場所を正しく認識できていない可能性があります。
まずはcompilerPathが正しく設定されているか確認しましょう。
必要に応じてincludePathなども確認します。
ブレークポイントで止まらない
デバッグ実行してもブレークポイントで停止しない場合は、デバッグ情報が含まれていない可能性があります。
GCCの場合は、次のように-gを付けてコンパイルします。
g++ -g main.cpp -o main
また、launch.jsonのprogramが実際に作成した実行ファイルを指しているか確認することも重要です。
VSCodeでC++を開発する基本的な流れ
VSCodeでC++開発を始める場合は、次のような流れになります。
- VSCodeをインストールする
- MicrosoftのC/C++拡張機能をインストールする
- GCC、Clang、MSVCなどのコンパイラをインストールする
g++ --versionやclang++ --versionなどで確認する- プロジェクトフォルダを作成する
main.cppを作成する- C++コードを書く
- コンパイルする
- プログラムを実行する
- 必要に応じてデバッグする
- プロジェクトが大きくなったらCMakeなどを導入する
初心者のうちは、まずターミナルから直接コンパイルと実行ができる状態を作ることが大切です。
その後、tasks.jsonやlaunch.json、CMakeなどを利用すると、より効率的な開発環境を構築できます。
まとめ
C++をVSCodeで開発するには、VSCodeだけでなく、C/C++拡張機能とC++コンパイラを用意する必要があります。
基本的な構成は次の通りです。
VSCode
↓
C/C++拡張機能
↓
GCC・Clang・MSVCなどのコンパイラ
↓
C++コードを作成
↓
コンパイル
↓
実行
↓
デバッグ
WindowsではMSVCやMinGW-w64系のGCC、macOSではClang、LinuxではGCCを利用する方法が代表的です。
小規模なプログラムであれば、g++ main.cpp -o mainなどのコマンドだけでも開発できます。
一方、複数のファイルや外部ライブラリを扱う本格的なプロジェクトでは、tasks.jsonやlaunch.jsonに加えて、CMakeなどのビルドシステムを利用すると管理しやすくなります。
また、c_cpp_properties.jsonのcppStandardは主にIntelliSenseの解析設定であり、実際に使用するC++標準はコンパイラ側でも指定する必要があります。
VSCode、拡張機能、コンパイラ、デバッガの役割をそれぞれ理解しておくと、C++の開発環境をトラブルなく構築しやすくなるでしょう。
以上、C++をVSCodeで開発する方法についてでした。
最後までお読みいただき、ありがとうございました。
