C++と色々

主にC++やプログラムに関する記事を投稿します。

Visual C++の __cplusplus について

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 にしている場合の値は仕様で決まっている値ではないので注意です。

learn.microsoft.com

2. _MSVC_LANG を使用する

定義済みマクロ _MSVC_LANG は上記の /Zc コンパイラオプションとは無関係に、常にコンパイラの言語標準による値になっています。 そのため、コンパイラオプションによらず常に _MSVC_LANG で言語標準を確認することができます。

learn.microsoft.com

個人的な使い分け

サードパティのライブラリを利用するとき、そのライブラリが __cplusplus で処理を分岐してそうなときは /Zc:__cplusplus コンパイラオプションで調整する、 自分が作るコードでは #if defined(_MSC_VER) などのマクロでVisual C++環境であることを確認したうえで _MSVC_LANG を使う。

まあ、うまくいけばどちらでもいいかなと思います。