2013-01-03 32 views
16

__cplusplusがVisual Studio 2012のC++プロジェクトで199711L(これは「古い」C++です)と定義されている理由は誰でも知っていますか? VS 2012でC++ 11がサポートされて以来、201103Lとは言わないのですか? C++ 11ヘッダーをインクルードしても、依然として間違って定義されています。すべての手がかりは?Visual Studio 2012 __cplusplusとC++ 11

答えて

14

これはすでにレビューのためにマイクロソフトに提出されました:

A value of predefined macro __cplusplus is still 199711L

+0

ありがとうございました。バグレポートに自分のコメントを追加しました。 –

+1

今は2014年ですが、VS 2013がリリースされており、フラグはまだ古いバージョンを報告しているようです(上記のリンクの説明に従ってください)。サポートされている機能については、C++ 14を開始することもできます。http://msdn.microsoft.com/en-us/library/hh567368.aspx - 「Visual Studio 2013のVisual C++では、一部のC++ 14ライブラリの選択機能もサポートしています。これは私が本当に理解していない、なぜ誰がどの機能を実装するかを選択できる理由です。これはますますポータビリティを台無しにするでしょう! – flohack

+1

@flohack - 適切なテクニカルトークを見れば、VSチームのさまざまな機能を実装するための作業負荷が... welll ... differentであることが分かります。いくつかは速く、他は遅くない。彼らは時間がかからないので、ライブラリに 'make_unique'を追加するような速いことをします。 MSは、非同期/提案の提案など、標準化のためのいくつかのことを先駆けていることも知っているので、私たちのアイデアや提案を改良するための実用的な実装があるように優先順位を付けます。実装するものを選択しているわけではなく、いつ選択するかということです。 – Mark

7

それは本当にあなたがマクロが実際に意味することを期待するものに依存します。 201103Lは "このコンパイラはコンパイラとライブラリの両方でC++ 11を完全にサポートしていますか?" "このコンパイラはC++ 11のいくつかの妥当なサブセットをサポートしていますか?" "このコンパイラは少なくとも1つの C++ 11の機能を何らかの方法で、形状、またはフォームでサポートしていますか?"

バージョン番号をいつバンプするかは、実際には各実装によって異なります。 Visual Studioは、ClangとGCCとは異なります。別のC++ 03コンパイルモードがないからです。特定の機能セットを提供し、それが提供する機能です。

一般に、1つのマクロは、いつ機能を使用するかを決定するのに便利なツールではありません。 Boost.Configははるかに信頼できるメカニズムです。標準委員会は、将来のバージョンの標準ではinvestigating ways of dealing with this problemです。

4

私はこの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の機能を実装して、良い宣伝をしています)、もっと控えめな方が良いです。

関連する問題