C++の開発において、現在使用しているコンパイラがどの言語規格に対応しているかを把握することは非常に重要です。
特に、近年ではC++20やC++23、さらには次世代のC++26といった新しい規格が次々と登場しており、利用できる機能が環境によって大きく異なります。
プロジェクトの要件を満たすコードを記述するためには、まず自分の開発環境の現状を知ることから始まります。
本記事では、開発環境のC++バージョンを確認するための具体的なコマンド操作から、ソースコード内での判定方法まで詳しく解説します。
コンパイラのバージョンを確認するコマンド
C++のプログラムをビルドする前に、まずはインストールされているコンパイラそのもののバージョンを確認しましょう。
コンパイラ自体が古い場合、最新の言語規格であるC++23やC++26の機能を利用できない可能性があるためです。
GCC (GNU Compiler Collection) の場合
LinuxやMinGW環境で広く利用されているGCCでは、--versionオプションを使用します。
ターミナルまたはコマンドプロンプトで以下のコマンドを入力してください。
g++ --version
g++ (Ubuntu 13.2.0-23ubuntu4) 13.2.0
Copyright (C) 2023 Free Software Foundation, Inc.
出力結果の最初の行に、現在のGCCのバージョンが表示されます。
最新の規格を試す場合は、GCC 14以降を使用することが推奨されます。
Clang の場合
macOSやLLVM環境で標準的なClangも、GCCと同様のコマンドで確認が可能です。
clang++ --version
clang version 18.1.0
Target: x86_64-pc-linux-gnu
Thread model: posix
Clangは比較的新しい規格への対応が早いため、バージョンが上がるごとにC++26のドラフト機能が次々と実装されています。
Microsoft Visual C++ (MSVC) の場合
WindowsのVisual Studioを使用している場合、開発者コマンドプロンプトからコンパイラ(cl.exe)のバージョンを確認できます。
cl
Microsoft(R) C/C++ Optimizing Compiler Version 19.40.33811 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
MSVCの場合、コンパイラのバージョン番号とVisual Studio製品のバージョン(例:Visual Studio 2022)は異なる点に注意してください。
C++ソースコード内でバージョンを判定する方法
コンパイラのバージョンだけでなく、実際にコードがどの規格としてコンパイルされているかをプログラム内で知る必要があります。
これには、標準で定義されている「__cplusplus」マクロを利用するのが一般的です。
__cplusplusマクロの値と規格の対応表
__cplusplusマクロは、コンパイル時に指定された言語規格に応じて特定の整数値を保持しています。
各規格に対応する値は以下の通りです。
| 規格 | __cplusplus の値 | 備考 |
|---|---|---|
| C++98 | 199711L | 初期の標準規格 |
| C++11 | 201103L | モダンC++の始まり |
| C++14 | 201402L | C++11のマイナーアップデート |
| C++17 | 201703L | 構造化束縛などの導入 |
| C++20 | 202002L | コンセプト、モジュールの導入 |
| C++23 | 202302L | 標準ライブラリの強化 |
| C++26 | 2026XXL (予定) | 次世代の規格(開発中) |
この値を確認することで、コード内で条件分岐(プリプロセッサ)を行い、特定のバージョン以上でのみ新しい機能を使用するといった制御が可能になります。
バージョン判定を行うサンプルコード
実際に現在のコンパイル環境のバージョンを表示するプログラムを作成してみましょう。
#include <iostream>
int main() {
// __cplusplusマクロの値を表示
std::cout << "C++ version value: " << __cplusplus << std::endl;
if (__cplusplus > 202302L) {
std::cout << "Working with C++26 or later." << std::endl;
} else if (__cplusplus == 202302L) {
std::cout << "Working with C++23." << std::endl;
} else if (__cplusplus == 202002L) {
std::cout << "Working with C++20." << std::endl;
} else if (__cplusplus == 201703L) {
std::cout << "Working with C++17." << std::endl;
} else {
std::cout << "Working with an older C++ standard." << std::endl;
}
return 0;
}
C++ version value: 202302
Working with C++23.
Visual Studio(MSVC)における注意点
MSVCでは、デフォルトの設定のままだと__cplusplusが古い値(199711L)を返し続けることがあります。
これは、既存の古いコードとの互換性を維持するための挙動です。
正しい値を反映させるためには、コンパイルオプションに/Zc:__cplusplusを追加する必要があります。
プロジェクト設定の「C/C++」→「コマンドライン」の追加のオプション欄に、このフラグを追記してください。
機能テストマクロによる詳細な確認
言語のバージョン全体だけでなく、特定の機能(たとえば「std::expected」や「concepts」)が利用可能かどうかを確認したい場合があります。
C++20からは、<version>ヘッダーが導入されました。
<version> ヘッダーの活用
このヘッダーをインクルードすることで、個別の機能が実装されているかどうかを定数マクロで判定できます。
#include <version>
#include <iostream>
int main() {
#ifdef __cpp_lib_format
std::cout << "std::format is available. Version: " << __cpp_lib_format << std::endl;
#else
std::cout << "std::format is not available." << std::endl;
#endif
#ifdef __cpp_concepts
std::cout << "Concepts are supported." << std::endl;
#endif
return 0;
}
このように、単純な__cplusplusの比較よりも、特定のライブラリ機能の有無に直接依存したコードを書く際に非常に有用です。
コンパイル時の規格指定方法
バージョンを確認した結果、意図した規格になっていない場合は、コンパイルオプションで明示的に指定する必要があります。
GCC/Clang での指定
-stdフラグを使用して指定します。
# C++20としてコンパイル
g++ -std=c++20 main.cpp
# C++23としてコンパイル
g++ -std=c++23 main.cpp
# 最新のC++26(実験的)としてコンパイル
g++ -std=c++26 main.cpp
CMake を使用する場合
モダンな開発では、CMakeLists.txt内で規格を指定するのが一般的です。
以下の記述を追加することで、環境に合わせた最適なフラグが自動的に選択されます。
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
これにより、コンパイラを意識せずに一貫したバージョン管理が可能になります。
まとめ
C++のバージョン確認は、適切な開発環境を構築し、最新の言語機能を最大限に活用するための第一歩です。
コンパイラのコマンドラインオプションを使えば、インストールされているツールの能力を素早く把握できます。
また、プログラム内では__cplusplusマクロや<version>ヘッダーを活用することで、環境に応じた柔軟なコード記述が可能です。
2026年現在、C++23が実用段階に入り、C++26への期待も高まっています。
自分の環境がどの地点にあるのかを正しく認識し、効率的なコーディングを心がけましょう。
もし意図した動作をしない場合は、コンパイラのオプション設定や、MSVCにおけるマクロの挙動設定などを再度確認してみてください。
