はじめに
筆者は、まだまだC++を学び始めて半年程度で、最近デザインパターンなどを意識し始めた、脱初心者レベルである。
また、本記事の執筆の際には、「Microsoft Visual Studio Community 2019 Version 16.6.5」環境で検証している。
マクロ「__cplusplus」がおかしい件
C++のバージョンをC++コード側で取得しようと思い、マクロ「__cplusplus」を使ってみた。
long version = __cplusplus;
std::cout << "C++ Version : " << version << "\n";
// 実行結果:C++ Version : 199711
この199711Lは、C++98を示すバージョンのようで、明らかに不正確である。
(shared_ptrとかclampとか使えてるからC++17以上でないとおかしい)
C++バージョンに応じた、マクロ__cplusplusの値は、こちらを参照。
https://cpprefjp.github.io/international-standard.html#list-of-iso-cpp
プロジェクトプロパティのC++バージョンをC++14やC++17に指定しても同様であった。
どうやら、これはVisual C++固有の仕様であるっぽい。
※追記:このマクロを有効化する手段あり(詳細は後述)
Visual C++でC++のバージョンを取得する方法
色々と調べてみたところ、C++のバージョン(と思われるもの)を記したマクロ「_MSVC_LANG」があるようで、充分代用が効きそうであった。
long version = _MSVC_LANG;
std::cout << "Visual C++ Version : " << version << "\n";
// プロパティオプションがC++14の実行結果:Visual C++ Version : 201402
// プロパティオプションがC++17の実行結果:Visual C++ Version : 201703
なるほど、凄く分かりやすい。
これを使って、良い感じに自作マクロ定義してあげると、Visual Studioにも対応したC++バージョンに応じた実装が可能になりそう。
勉強になった。
追記:Visual C++での「__cplusplus」 マクロの有効化
uemurajさんにコメントで教えて頂いたやり方が、もっと良さげだったので追記しておく。(素晴らしい情報提供ありがとうございます。)
- プロジェクトの [プロパティ ページ]を開く
- [構成プロパティ] > [C/C++] > [コマンド ライン]まで移動
- [追加オプション] ウィンドウに以下の2つのどちらかを追加し、適用。(筆者は前者を使用)
/Zc:__cplusplus
/Zc:__cplusplus-
参考:/Zc:__cplusplus (更新された __cplusplus マクロの有効化) | Microsoft Docs
この設定を適用した状態で、以下の内容で実行した結果、望ましい結果が得られた。
// マクロ「__cplusplus」を有効化したうえで使用した場合
long lCppVersion = __cplusplus;
std::cout << "マクロ「__cplusplus」 : " << lCppVersion << "\n";
// マクロ「_MSVC_LANG」を使用した場合
long lVCppVersion = _MSVC_LANG;
std::cout << "マクロ「_MSVC_LANG」 : " << lVCppVersion << "\n";
// プロジェクトプロパティでC++14を指定時の実行結果
// マクロ「__cplusplus」 : 201402
// マクロ「_MSVC_LANG」 : 201402
参考にしたサイト
- マクロ「__cplusplus」で取得できるバージョンについて
C++国際標準規格 - cpprefjp C++日本語リファレンス - マクロ「_MSVC_LANG」で取得できるバージョンについて
処理系 - cpprefjp C++日本語リファレンス - マクロ「_cplusplus」をVisual C++で有効化する方法について
/Zc:__cplusplus (更新された __cplusplus マクロの有効化) | Microsoft Docs