2012-01-14 18 views
2

C++ 03では、MSVCとGCCの両方でクロスプラットフォームコードを作成し、Windows、Linux、Mac OS X間でC++コードベースを共有することができました。クロスプラットフォームC++ 11コードの開発

今、C++ 11の状況はどうですか?異なるC++コンパイラがC++ 11のさまざまな機能を実装しているようです。クロスプラットフォームのC++ 11コードを構築するには、MSVC10(VS2010)を一種の「最小公約数」とするのは安全ですか?つまり、承認されたC++ 11の機能をMSVC10によって実装された機能に制限すると、結果として得られるC++ 11のコードはGCCとコンパイルできます(LinuxとMac OS Xの両方で使用可能)。

クロスプラットフォームコードが必要な場合は、C++ 11コンパイラが成熟してC++ 03に固執するのを待つ方が良いでしょうか?

ありがとうございました。

+5

私はどのような答えを期待しているのでしょうか。すべてのコンパイラがサポートする機能を使用し、使用しない機能は使用しないでください。これはC++ 11固有のものではなく、新しい標準が出現するたびに発生します。代わりに、どこでも同じコンパイラを使用して、それを心配する必要はありません。 – Mat

+0

コンパイラはC++ 11のすべてをサポートしていないので、簡単な答えはできません。 –

答えて

1

C++ 11は、すでに分かっているように、プライムタイムの準備ができていません。

さまざまなコンパイラで解析の段階が進行しているばかりでなく、いくつかの機能を受け入れるように見える中には、現在のリリースで不具合やバグがあるかもしれないという問題もあります。

私は考えることができる唯一のサウンドアプローチは、まず、使用したいコンパイラを選択することです:

  • あなたは(のlibstdC++で)Windows上でのgcc /クランを使用することができますしかし、これは、図書館との相互作用を防止することができますあなたが使用したいコンパイラを決定したら、

VC++

  • でコンパイル(必要であれば、おそらくいくつかの他)あなたは一方で、あなたのgcc /クランとVC++の両方のコードを検証することができます
  • 次に、C++ 11の機能を選択する必要がありますあなたが使いたいと思っているもの、そしてそれらすべてのコンパイラで動作するもの。GCCは、おそらく
  • ここで、より高度なクランはラムダを持っていないが、セマンティクスと可変長テンプレート
  • VC++は、ほとんどの背後に私が
  • を考えると、あなたが設定する必要があるが移動している

    • これらすべてのコンパイラを使用したテストスイート、対象とするすべてのプラットフォーム上で実行することができます。特に、コード生成の問題には注意が必要です。 ValgrindをLinuxの例で使用し、Purify(または相当するもの)をWindowsで使用することをお勧めします。

      VC++とg ++の両方が、標準ではない拡張子を標準で受け入れている可能性があり、C++ 11の以前のドラフトのコードの解釈にも基づいていることに注意してください。

      正直、プロダクション用として、これはまだちょっと怪しいですね。

    +0

    ありがとうございます。 MSVCとC++の両方でサポートされているC++ 11の「安全な」サブセットは、パフォーマンスの向上をもたらすmoveセマンティクス、nullptr、autoおよびlambdaです。だから私は、これらの機能を選択することは、プロダクションコードではOKだと思う。私は、新しいC++ 11ライブラリが両方のコンパイラでどのように実装されているのかよくわかりません(MSVCはGCCの後ろにありますが、ライブラリにとっては良い形です)。 –

    +0

    @ Mr_C64:実際には、ラムダはまだクランによってサポートされていません。また、私はどのように3つのコンパイラ(そしてどのように 'std :: atomic <>' fares)にスレッディングサポートがあるのか​​わかりませんが、もちろんマルチスレッドコードにしか関係ありません:) –

    2

    GCCを使用してWindows用のコードをコンパイルできます。 Microsoftのコンパイラを使用する必要はありません。

    現在、C++ 11の機能を無駄なく使用したい場合は、これが最善の解決策になります。マイクロソフトはまだC++ 11をまだ実装していないし、VS11に含まれる予定もない。

    そうでなければ、最低限の共通分母を表すコンパイラの実装でサポートされているC++ 11の機能のサブセットを使用することもできます。あなたはそれがであると仮定して、新しい機能のすべてに対してMicrosoftのコンパイラであることを確認し、確認する必要があります。と仮定します。
    私はGCCがまだすべてを知っているとは思っていません。そして、すべての機能の実装が完全であり、Microsoftの100%にマッチするという保証はありません。完全に移植可能なコードを記述することは、常に困難であり続けてきました。

    C++ 03の機能のみを使用するのは明らかに安全な方法ですが、C++ 11の機能を使用することはできません(明らかに)。むしろ重要なことは、あなただけができる決定です。

    +0

    それほど難しいことではありませんが、プラットフォームの違いを抽象化する必要があります。 C++アプリケーションをクロスプラットフォームにすることは非常に管理しやすいです。もちろん、C++ 2011の領域に入ると、コンパイラはそれをサポートする必要があります。 – piotr

    +0

    @piotr:はい、クロス*プラットフォーム*コードについては言及していませんでした。私は、どのコンパイラでもコンパイルできる移植可能なコードについて話していました。あなたのコンパイラがサポートしていない機能を抽象化することはできません。 –

    0

    新しいコードを記述している場合は、明日リリースする予定はありません。

    リリース日を計画してください。残りの部分よりも遅く受け入れられるいくつかの機能があります。実装された機能や複製された機能(ループの範囲など)はほとんどありません。

    私は新しいライブラリ機能の使用について心配することはありません。それらはすでにすべてのコンパイラで非常によくサポートされています。

    現在のところ、マイクロソフトはライブラリに集中することを決めたが、残りは言語機能のために(ほとんど)使用されていたため、共通の分母は存在しません。

    0

    Visual C++ 2011のスタジオサポートは非​​常に優れているので、GCC 4.7とVS2010を使用すると、C++ 2011の最も興味深い機能をクロスプラットフォームで使用することができます。 https://wiki.apache.org/stdcxx/C++0xCompilerSupport

    GCC C++ 11のサポート: http://gcc.gnu.org/projects/cxx0x.html

    は、関連:C++11 features in Visual Studio 2012すべてのコンパイラのためのC++ 11 VC10及びVC11の概要 http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx

    テーブルの

    サポート

    0

    これは主にプロジェクトによって異なります。バイナリのみを出荷する場合、使用するツールセットを把握し、このツールセットがサポートするものに固執する必要があります。あなたのチームが異なるツールを使用していれば、自分のコードが共通ビルドシステム(C++ 03またはC++ 11)でビルドされていることを確認する必要があります。

    宣言以上のものを含むヘッダーを発送するとすぐに状況が変わります。まず第一に、どのコンパイラによってサポートされているかを判断するためのインフラストラクチャが必要です。これらのテストを自分で作成し、ビルドシステムと統合するか、Boost.Configに固執することができます。 ifdefよりプラットフォーム依存のコードを使用できます。これは最初は簡単に聞こえるが、実際にはそうではない。 C++ 11のコードでは、C++言語で実装できるようになるたびに、両方のバージョンをユーザーに提供したいと考えています(例:variadicテンプレートとプリプロセッサ)。これによりコードが重複し、大幅な保守コストがかかります。回避策(より良いコンパイラエラーメッセージ(バリデーションテンプレート対マクロ)、より良いパフォーマンス(セマンティクスの移動))より明らかな利点を提供する場合、通常はC++ 11コードのみを含めます。

    0

    コードを何らかの形で改善する現時点では、C++ 11の機能のみを使用してください。 私はこれを説明しましょう、私はC++ 11の機能を使用していません。 (これは私がそれらについて学んだ方法です、すべてSOです)このアプローチは将来変わりますが、今はこれをやっています。

    私は現在、VS2010とGCCの両方で動作するC++ 11の機能はほとんど使用していません。 また、素晴らしい機能がある場合は、使いたいと思っています.VSはそれを持っていません.GCCを使わないのはなぜですか?クロスプラットフォームなので、ウィンドウでも動作します。

    関連する問題