C++の「バージョン確認」といっても、確認対象は1つではありません。
主に確認するポイントは、次の3つです。
- 使用しているC++コンパイラのバージョン
- コンパイル時に使われているC++規格のバージョン
- IDEやビルドツールで設定されているC++標準
C++は、単体のアプリケーションのように「C++本体のバージョン」を確認するものではありません。
実際には、GCC、Clang、MSVCなどのコンパイラが、どのC++規格に対応しているか、また現在どのC++規格でコンパイルされているかを確認します。
そのため、C++のバージョンを確認するときは、「コンパイラのバージョン」と「C++規格のバージョン」を分けて考えることが重要です。
コンパイラのバージョンを確認する
GCC / g++の場合
Linux、WSL、MinGWなどでC++を使っている場合は、GCC系のコンパイラであるg++を使用していることが多いです。
C++開発では、C言語用のgccではなく、C++用のg++のバージョンを確認するのが基本です。
表示される情報には、GCCのバージョン番号や配布元の情報が含まれます。
たとえば、Ubuntu環境であれば、Ubuntu向けにビルドされたGCCのバージョンが表示されます。
コンパイラのバージョンを確認することで、その環境がC++17、C++20、C++23などにどの程度対応しているかを判断しやすくなります。
ただし、コンパイラのバージョンが新しいからといって、必ずすべてのC++機能が使えるとは限りません。
特にC++20以降では、コンパイラ本体と標準ライブラリの対応状況に差がある場合があります。
Clang / clang++の場合
macOSやLinuxでは、Clang系のコンパイラを使っている場合もあります。
特にmacOSでは、Appleが提供しているApple Clangが標準的に使われることが多くあります。
Clangのバージョンを確認すると、通常のLLVM Clangなのか、Apple独自のApple Clangなのかも分かります。
Apple Clangは、通常のClangとはバージョン表記やC++機能への対応状況が完全には一致しない場合があります。
そのため、C++20やC++23の機能を使う場合は、バージョン番号だけで判断せず、実際に使いたい機能がその環境で利用できるか確認することが大切です。
MSVCの場合
WindowsでVisual Studioを使っている場合は、Microsoft Visual C++、つまりMSVCを使用していることが多いです。
MSVCのバージョンを確認する場合は、Visual Studio用の開発者コマンドプロンプトを使うのが一般的です。
通常のコマンドプロンプトやPowerShellでは、必要な環境変数が設定されておらず、MSVCのコンパイラを直接呼び出せない場合があります。
その場合は、Developer Command Promptやx64 Native Tools Command Promptなどを使用します。
MSVCのバージョンは、Visual Studioの製品バージョンとは完全には一致しません。
たとえば、Visual Studio 2022を使っていても、内部で使われるMSVCコンパイラには別のバージョン番号があります。
C++の対応状況を確認したい場合は、Visual Studioの製品名だけでなく、MSVCコンパイラ自体のバージョンも確認することが重要です。
C++規格のバージョンを確認する
C++規格とは
C++には複数の標準規格があります。
代表的なものには、C++98、C++03、C++11、C++14、C++17、C++20、C++23などがあります。
現在の学習や実務でよく使われるのは、C++17やC++20です。
新しい機能を積極的に使う場合は、C++23を選ぶこともあります。
ただし、コンパイラが新しくても、自動的に最新のC++規格でコンパイルされるとは限りません。
多くの環境では、使用するC++規格を明示的に指定しないと、古い標準やコンパイラ独自の既定設定が使われることがあります。
コンパイラのバージョンとC++規格は別物
C++のバージョン確認で特に注意したいのが、コンパイラのバージョンとC++規格のバージョンは別物だという点です。
たとえば、C++20に対応している新しいコンパイラを使っていても、ビルド設定がC++14になっていれば、C++20の機能は使えません。
逆に、C++20を指定していても、コンパイラや標準ライブラリの対応が不十分な場合、一部の機能が使えないことがあります。
つまり、C++のバージョン確認では、次の2つを分けて確認する必要があります。
- そのコンパイラがどのC++規格に対応しているか
- 現在のビルド設定でどのC++規格が使われているか
この2つを混同すると、「コンパイラは新しいのにC++20の機能が使えない」といったトラブルにつながります。
定義済みマクロでC++規格を確認する
C++では、定義済みマクロを使って、現在どのC++規格としてコンパイルされているかを確認できます。
代表的なのが、__cplusplusです。
この値を見ることで、C++98、C++11、C++14、C++17、C++20、C++23のどのモードでコンパイルされているかを判断できます。
主な値の目安は次のとおりです。
| 値 | 対応するC++規格 |
|---|---|
| 199711L | C++98 / C++03 |
| 201103L | C++11 |
| 201402L | C++14 |
| 201703L | C++17 |
| 202002L | C++20 |
| 202302L | C++23 |
実際に画面へ出力した場合、末尾のLは表示されず、数値だけが表示されることがあります。これは異常ではありません。
たとえば、C++17としてコンパイルされている場合は、201703のような値が表示されます。
MSVCでC++規格を確認するときの注意点
__cplusplusが正しい値にならない場合がある
MSVCでは、__cplusplusを使う際に注意が必要です。
Visual Studioの設定によっては、C++17やC++20でコンパイルしていても、__cplusplusの値が古いC++98相当の値として表示されることがあります。
この場合、MSVC側で__cplusplusを標準どおりに扱う設定を有効にする必要があります。
この設定を有効にすると、C++17ならC++17相当の値、C++20ならC++20相当の値が正しく取得できるようになります。
_MSVC_LANGも確認対象になる
MSVCでは、__cplusplusに加えて、_MSVC_LANGという定義済みマクロも用意されています。
_MSVC_LANGは、MSVC環境で現在どのC++標準モードが使われているかを確認するために便利です。
そのため、Visual StudioやMSVCを使っている場合は、__cplusplusだけでなく、_MSVC_LANGも確認するとより確実です。
特に、__cplusplusの値が期待どおりにならない場合は、_MSVC_LANGの値を見ることで、実際に指定されているC++標準を判断しやすくなります。
MSVCでは指定できるC++標準に違いがある
GCCやClangでは、C++11、C++14、C++17、C++20、C++23などを比較的そのまま指定できます。
一方、MSVCでは指定できる標準モードに違いがあります。
Visual Studio 2017以降では、C++14より前の標準モードは基本的に指定できません。
そのため、MSVCではC++11やC++98を明示的な標準モードとして選ぶという考え方は、GCCやClangとは少し異なります。
MSVCでは、主に次のような標準モードを使い分けます。
- C++14
- C++17
- C++20
- C++23プレビュー
- 最新モード
Windows環境でC++規格を確認する場合は、このMSVC特有の仕様を理解しておくと、設定ミスを防ぎやすくなります。
VS CodeでC++のバージョンを確認する場合
VS Code自体はC++コンパイラではない
VS CodeでC++を書いている場合、VS Codeそのもののバージョンを確認しても、C++のコンパイラや規格の確認にはなりません。
VS Codeはあくまでエディタです。実際にC++をコンパイルしているのは、別途インストールされているコンパイラです。
代表的なコンパイラには、GCC、Clang、MSVC、MinGW、WSL上のGCCなどがあります。
そのため、VS CodeでC++のバージョンを確認したい場合は、VS Codeではなく、裏側で使われているコンパイラを確認する必要があります。
ビルド設定も確認する必要がある
VS Codeでは、タスク設定や拡張機能の設定によって、どのコンパイラを使うか、どのC++規格でコンパイルするかが変わります。
たとえば、ターミナルから手動でコンパイルしている場合と、VS Codeのビルドタスクからコンパイルしている場合で、使用されるC++規格が異なることがあります。
C++17やC++20を使いたい場合は、実際のビルド設定でそのC++規格が指定されているかを確認することが大切です。
VS Code上でエラーが出ていなくても、ビルド時には別の設定が使われている場合があります。
エディタの補完設定と、実際のコンパイル設定が一致しているかも確認すると安心です。
CMakeでC++規格を確認する場合
CMakeLists.txtの設定を確認する
CMakeを使っているプロジェクトでは、C++規格がCMakeLists.txtに指定されていることが多くあります。
CMakeLists.txtでC++17やC++20が指定されていれば、そのプロジェクトは基本的にそのC++規格でビルドされます。
ただし、CMakeの設定、コンパイラの種類、ビルド環境によっては、期待した規格にならない場合もあります。
そのため、CMakeを使っている場合は、CMakeLists.txtの設定だけでなく、実際に生成されたビルド設定やコンパイルオプションも確認するとより確実です。
コンパイラ拡張の扱いにも注意する
GCCやClangでは、標準C++だけでなく、コンパイラ独自の拡張機能が有効になる場合があります。
標準準拠のC++としてビルドしたい場合は、CMake側でコンパイラ拡張を無効にする設定を行うことがあります。
この設定を行うことで、GCCやClang独自の拡張に依存しにくくなり、別のコンパイラや環境でもビルドしやすいコードになります。
移植性を重視するプロジェクトでは、C++規格の指定だけでなく、コンパイラ拡張の有無も確認しておくとよいです。
C++規格の対応状況を確認するときの注意点
新しいコンパイラでも全機能に対応しているとは限らない
C++20やC++23は規格として存在していますが、すべてのコンパイラがすべての機能を完全に実装しているとは限りません。
特にC++20以降では、言語機能と標準ライブラリ機能の実装状況に差が出ることがあります。
たとえば、コンパイラ本体はあるC++機能に対応していても、標準ライブラリ側がまだ一部未対応という場合があります。
そのため、新しいC++機能を使いたい場合は、コンパイラのバージョンだけではなく、その機能が実際に使えるかどうかを確認することが大切です。
エラー内容は環境によって異なる
未対応のC++規格や機能を使った場合、コンパイルエラーが発生します。
ただし、エラー内容はコンパイラやバージョンによって異なります。
ある環境では、指定した標準オプション自体が認識されない場合があります。
別の環境では、標準オプションは認識されても、特定の機能やヘッダーが未対応としてエラーになる場合があります。
そのため、エラーメッセージだけで単純に判断せず、次の要素をあわせて確認する必要があります。
- 使用しているコンパイラの種類
- コンパイラのバージョン
- 指定しているC++規格
- 使用している標準ライブラリ
- ビルドツールやIDEの設定
これらを総合的に見ることで、C++規格に関するトラブルの原因を特定しやすくなります。
目的別の確認ポイント
コンパイラのバージョンを知りたい場合
コンパイラのバージョンを知りたい場合は、GCC、Clang、MSVCなど、実際に使用しているコンパイラの情報を確認します。
C++開発では、エディタやIDEのバージョンよりも、実際にコンパイルしているコンパイラのバージョンが重要です。
特にVS Codeのようなエディタを使っている場合は、VS Codeではなく、裏側で動いているコンパイラを確認します。
どのC++規格でコンパイルされているか知りたい場合
現在どのC++規格でコンパイルされているかを知りたい場合は、__cplusplusなどの定義済みマクロを確認します。
MSVCを使っている場合は、_MSVC_LANGもあわせて確認するとより確実です。
コンパイラのバージョンだけでは、実際に使われているC++規格は判断できません。
ビルド設定でC++17、C++20、C++23などが正しく指定されているかを確認する必要があります。
C++17やC++20を使いたい場合
C++17やC++20を使いたい場合は、コンパイル時の設定やビルドツールの設定で、使用するC++規格を明示的に指定します。
GCCやClangでは、C++17、C++20、C++23などを指定できます。
MSVCでは、C++14、C++17、C++20、C++23プレビュー、最新モードなどを選択できます。
プロジェクトで使うC++規格を統一したい場合は、個別のコンパイルコマンドだけでなく、CMakeやIDEのプロジェクト設定にも同じ内容を反映させることが大切です。
VS Codeで確認したい場合
VS Codeを使っている場合は、VS Code自体ではなく、実際に使われているコンパイラとビルド設定を確認します。
ターミナルで手動コンパイルしている場合、VS Codeのビルドタスクを使っている場合、CMake Toolsなどの拡張機能を使っている場合で、設定場所が変わります。
補完やエラー表示の設定と、実際のビルド設定がずれていることもあります。
そのため、VS Code上では問題なさそうに見えても、実際のコンパイル時にC++規格の違いでエラーが出ることがあります。
CMakeプロジェクトで確認したい場合
CMakeプロジェクトでは、CMakeLists.txtにC++規格が指定されているかを確認します。
プロジェクトによっては、C++17やC++20を必須にしている場合があります。
また、標準準拠を重視する場合は、コンパイラ独自の拡張機能が無効になっているかも確認するとよいです。
CMakeを使っている場合、IDE側の設定よりもCMakeLists.txtの設定が優先されることがあります。
そのため、Visual StudioやVS Codeで設定を変更しても、CMake側の指定によって上書きされる場合があります。
よくある勘違い
C++のバージョンとコンパイラのバージョンを混同する
C++17やC++20は、C++の標準規格の名前です。
一方、GCC 13、Clang 18、MSVC 19.40などは、コンパイラのバージョンです。
この2つは別物です。
コンパイラのバージョンが新しいほど新しいC++規格に対応している可能性は高くなりますが、実際にどのC++規格でコンパイルするかはビルド設定によって決まります。
VS Codeのバージョンを確認すればよいと思ってしまう
VS CodeはC++コンパイラではありません。
そのため、VS Codeのバージョンを確認しても、C++17やC++20に対応しているかは分かりません。
確認すべきなのは、VS Codeから呼び出されているGCC、Clang、MSVCなどのコンパイラです。
C++20を指定すればすべてのC++20機能が使えると思ってしまう
C++20を指定しても、すべてのC++20機能が必ず使えるとは限りません。
コンパイラの対応状況や標準ライブラリの実装状況によって、一部の機能が使えない場合があります。
特に、新しい規格の機能を使う場合は、使用するコンパイラと標準ライブラリの対応状況を確認することが重要です。
まとめ
C++のバージョン確認では、まず確認対象を明確にすることが大切です。
コンパイラ自体のバージョンを知りたい場合は、GCC、Clang、MSVCなど、実際に使用しているコンパイラを確認します。
どのC++規格でコンパイルされているかを知りたい場合は、__cplusplusを確認します。
MSVCでは、_MSVC_LANGもあわせて確認するとより確実です。
VS Codeを使っている場合は、VS Codeそのものではなく、裏側で使われているコンパイラとビルド設定を確認します。
CMakeを使っている場合は、CMakeLists.txtのC++標準設定を確認します。
C++のバージョン確認では、「コンパイラのバージョン」と「C++規格のバージョン」を分けて考えることが重要です。
この2つを正しく確認することで、C++17やC++20などの機能が使えない原因を判断しやすくなります。
以上、C++のバージョン確認の方法についてでした。
最後までお読みいただき、ありがとうございました。
