Visual C++の '__cplusplus' はコンパイラのC++の言語標準によらず 199711L
を返します。
その理由について以下の投稿に書かれていました。
developercommunity.visualstudio.com
It is roughly intentional that we don’t change the value of __cplusplus with language modes: we tried to do so a couple of years ago, and it broke many third-party libraries.
拙訳
__cplusplus
の値を言語標準によらず変更しないことは意図的です。数年前に変更しようとしてみましたが、たくさんのサードパーティライブラリが壊れました。
悲しいなぁ…… 😢
解決方法は2通りあります。
1. /Zc:__cplusplus
コンパイラオプションを使う
/Zc:__cplusplus
コンパイラオプションを使うと、コンパイラのC++の言語標準のによって __cplusplus
の値が変わるようになります。
プロジェクトのプロパティに専用の項目はないのでコマンドラインプロパティで直接記述します。
言語標準を /std:c++lastest
にしている場合の値は仕様で決まっている値ではないので注意です。
2. _MSVC_LANG
を使用する
定義済みマクロ _MSVC_LANG
は上記の /Zc
コンパイラオプションとは無関係に、常にコンパイラの言語標準による値になっています。
そのため、コンパイラオプションによらず常に _MSVC_LANG
で言語標準を確認することができます。
個人的な使い分け
サードパティのライブラリを利用するとき、そのライブラリが __cplusplus
で処理を分岐してそうなときは /Zc:__cplusplus
コンパイラオプションで調整する、
自分が作るコードでは #if defined(_MSC_VER)
などのマクロでVisual C++環境であることを確認したうえで _MSVC_LANG
を使う。
まあ、うまくいけばどちらでもいいかなと思います。