Visual Studio 2012 c ++プロジェクトで(「古い」C ++)__cplusplus
として定義されている理由を知っている人はいますか?VS2012がC++11をサポートする199711L
ようになったので、言うべきではありませんか?201103L
C ++ 11ヘッダーを含めても、誤って定義されています。手がかりはありますか?
4 に答える
これは、レビューのためにすでにMicrosoftに提出されています。
それは、そのマクロが実際に何を意味するのかによって異なります。201103Lは、「このコンパイラは、コンパイラとライブラリの両方でC ++ 11のすべてを完全にサポートする」という意味ですか?「このコンパイラはC++11の妥当なサブセットをサポートしている」という意味ですか?「このコンパイラは、何らかの形、形、または形式で少なくとも1つのC ++ 11機能をサポートしていますか?」という意味でしょうか。
バージョン番号をいつ上げるかを決めるのは、実際には各実装次第です。Visual Studioは、個別のC ++ 03コンパイルモードがないため、ClangやGCCとは異なります。それは特定の機能のセットを提供し、それが提供するものです。
一般に、単一のマクロは、ある機能をいつ使用するかを決定するための便利なツールではありません。Boost.Configは、はるかに信頼性の高いメカニズムです。標準委員会は、標準の将来のバージョンでこの問題に対処する方法を調査しています。
私はこれについてニコルと一緒です。テストする唯一の理由__cplusplus >= 201103L
は、新機能を使用できるかどうかを確認することです。コンパイラが新機能の半分だけを実装しているが、の新しい値を使用している場合、__cplusplus
によって保護されている有効なC ++ 11コードの多くをコンパイルできません__cplusplus >= 201103L
(使用thread_local
および*this
参照するものがいくつかあります)。一方199711L
、それが維持される場合は、安全なC ++ 98コードを使用しますが、それでも問題ありません。その方法でいくつかの最適化を見逃す可能性がありますが、特定の機能が利用可能かどうかを検出するために他の方法を使用できます(コンパイラバージョン、コンパイラマクロなどのコンパイラ固有マクロ、コンパイラ__GXX_EXPERIMENTAL_CXX0X__
マクロをチェックするブーストマクロなど)。重要なのは安全なデフォルトです。
__cplusplusの新しい値に切り替える理由は2つ考えられます。
- コンパイラはC++11を完全にサポートしています(または十分に近い場合、常にバグがあります)
- これはコンパイラの実験的なモードであり、本番環境では使用しないでください。通常、機能が不足しているものはバグとしてカウントされます。
私の知る限り、切り替えたすべてのコンパイラは2番目のカテゴリにあります。
一部のコンパイラベンダーは、__ cplusplus(実装が最も簡単なC ++ 11機能、優れた宣伝)の値の変更に熱心すぎると思います。また、一部のベンダーはより保守的であるのは良いことです。
2018年4月の時点で、MSVC 2017はマクロを正しく報告するようになりましたが、特定のスイッチが使用されている場合に限ります(/ Zc:__ cplusplus)。これは、多くの古いコードがMSVCコンパイラのマクロの古い値の検出に依存しているためです。ソース:https ://blogs.msdn.microsoft.com/vcblog/2018/04/09/msvc-now-correctly-reports-__cplusplus/
うまくいけば、将来的には、世界中の人々がコードを更新すると、MSはデフォルトでマクロを正しく報告します。