__cplusplus
がVisual Studio 2012のC++プロジェクトで199711L
(これは「古い」C++です)と定義されている理由は誰でも知っていますか? VS 2012でC++ 11がサポートされて以来、201103L
とは言わないのですか? C++ 11ヘッダーをインクルードしても、依然として間違って定義されています。すべての手がかりは?Visual Studio 2012 __cplusplusとC++ 11
答えて
これはすでにレビューのためにマイクロソフトに提出されました:
それは本当にあなたがマクロが実際に意味することを期待するものに依存します。 201103Lは "このコンパイラはコンパイラとライブラリの両方でC++ 11を完全にサポートしていますか?" "このコンパイラはC++ 11のいくつかの妥当なサブセットをサポートしていますか?" "このコンパイラは少なくとも1つの C++ 11の機能を何らかの方法で、形状、またはフォームでサポートしていますか?"
バージョン番号をいつバンプするかは、実際には各実装によって異なります。 Visual Studioは、ClangとGCCとは異なります。別のC++ 03コンパイルモードがないからです。特定の機能セットを提供し、それが提供する機能です。
一般に、1つのマクロは、いつ機能を使用するかを決定するのに便利なツールではありません。 Boost.Configははるかに信頼できるメカニズムです。標準委員会は、将来のバージョンの標準ではinvestigating ways of dealing with this problemです。
私はこの1つではニコールです。 __cplusplus >= 201103L
をテストする唯一の理由は、新しい機能を使用できるかどうかを確認することです。コンパイラが新しい機能の半分しか実装していて、新しい値__cplusplus
を使用した場合、__cplusplus >= 201103L
で保護された有効なC++ 11コードをコンパイルできません(thread_local
と*this
参照を使用しています)。一方、199711L
を保持している場合は、安全なC++ 98コードを使用しますが、それでも問題ありません。コンパイラのバージョン、__GXX_EXPERIMENTAL_CXX0X__
のようなコンパイラ固有のマクロ、コンパイラマクロをチェックするブーストマクロなど)を使用して、特定の機能が利用可能かどうかを検出することができます。重要なのは安全なデフォルトです。
__cplusplusの新しい値に切り替える2つの理由が考えられます。
- あなたのコンパイラがあるC++ 11(または十分に近い、常にバグが存在します)
- ためフルサポート本番環境では使用すべきではないコンパイラの実験モードであり、通常欠けている機能はバグとしてカウントされます。
私が知る限り、切り替えたすべてのコンパイラは2番目のカテゴリにあります。
私は、__cplusplusの値を変更することに熱狂している人もいると思いますが(最も簡単なC++ 11の機能を実装して、良い宣伝をしています)、もっと控えめな方が良いです。
- 1. ReportViewer 11(2012)Visual Studio 2010
- 2. C++ 11 Magic Stics Visual Studio 2012の回避策
- 3. Visual Studio 2012のC++ユニットテスト
- 4. Visual Studio 2012コマンドラインコンパイラ
- 5. Visual Studio 2012コードカバレッジ
- 6. Xamarin Visual Studio 2012
- 7. Visual Studio 2012:クラス
- 8. Visual Studio 2012のデータベースダイアグラム?
- 9. Visual Studio 2015 C++プロジェクトエラーC++ 11標準
- 10. Visual Studio 2015 vs 2012
- 11. のVisual Studio 2012とEmguCV号
- 12. Visual Studio Express 2012とGit
- 13. Visual Studio 11セットアッププロジェクト
- 14. のVisual Studio 11のインストールエラー
- 15. マイクロソフトのVisual Studio 2012のC#ファイル
- 16. のVisual Studio 2012 C++ブーストSignal2信号
- 17. Visual Studio 11 betaと.NET 4.5
- 18. SSRS Visual Studio 2012、レポートサーバーテンプレートプロジェクト
- 19. Visual C++ 2012 FatalExecutionEngineError
- 20. Visual Studio 2012 | 2015インデントボタン
- 21. Visual Studio 2012のTFS
- 22. Visual Studio 2012 ExtJS IntelliSense
- 23. Visual Studio 2012のプライベートアクセサリー
- 24. Visual Studio 2012 PowerShellプロジェクト
- 25. Visual Studio 2012のクイックスイッチングスタートアッププロジェクト
- 26. Visual Studio 2012のドキュメントダウンロード
- 27. Visual Studio 2012のPowerCommands?
- 28. Visual Studio 2015:Android用ビルドC++ 11ライブラリ
- 29. Visual Studio 2012 "スマート"インデントのカスタマイズ
- 30. Visual Studio 11 CTP3のバグ?
ありがとうございました。バグレポートに自分のコメントを追加しました。 –
今は2014年ですが、VS 2013がリリースされており、フラグはまだ古いバージョンを報告しているようです(上記のリンクの説明に従ってください)。サポートされている機能については、C++ 14を開始することもできます。http://msdn.microsoft.com/en-us/library/hh567368.aspx - 「Visual Studio 2013のVisual C++では、一部のC++ 14ライブラリの選択機能もサポートしています。これは私が本当に理解していない、なぜ誰がどの機能を実装するかを選択できる理由です。これはますますポータビリティを台無しにするでしょう! – flohack
@flohack - 適切なテクニカルトークを見れば、VSチームのさまざまな機能を実装するための作業負荷が... welll ... differentであることが分かります。いくつかは速く、他は遅くない。彼らは時間がかからないので、ライブラリに 'make_unique'を追加するような速いことをします。 MSは、非同期/提案の提案など、標準化のためのいくつかのことを先駆けていることも知っているので、私たちのアイデアや提案を改良するための実用的な実装があるように優先順位を付けます。実装するものを選択しているわけではなく、いつ選択するかということです。 – Mark