8

これは非常に情報に基づいていない質問ですが、次のとおりです。

C++11を使い始めたいです。古い gcc 4.2.1 コンパイラでコンパイルされたライブラリの膨大なコレクションを引き続き使用できますか?それとも、新しいコンパイラですべてを再コンパイルする必要がありますか? 答えはノーだと思います(または望んでいます)が、私はただの初心者です。

私の無知の少なくとも一部を取り除くために、どちらの場合も理由を説明できますか?

ありがとう

4

5 に答える 5

9

はい、そうすべきです。

弱い理由はバイナリ互換性ではなく、問題は期待に関するものです。C++11 対応のコンパイラは、多くの機能が利用可能 (それらの間でコンストラクターを移動) であると想定し、適切な場合にそれらを使用します。そして、これは氷山の一角にすぎません。他にもいくつかの非互換性があります ( auto0およびポインターとの相互作用など)。

これは、C++11 標準に照らして、ヘッダー内のインライン メソッドが突然異なる方法で解釈される可能性があることを意味します。

より強力な理由は、コンパイラの各バージョンには独自の標準ライブラリ実装が付属しているためです。さまざまなバージョンの混在を開始したくはありません。特に、そのような大きな変更が行われた場合はそうではありません (繰り返しますが、右辺値参照...)。

私を信じてください、表示される各バグは古いライブラリと新しいライブラリ間の非互換性が原因である可能性があるというしつこい考えを抱くよりも、今すぐ再コンパイルする方が簡単です...

于 2012-02-23T07:29:20.227 に答える
3

コンパイラの質問です。たとえば、コンパイラ スイッチに応じて と の両方をサポートする単一のコンパイラがある場合、ライブラリを混在させることができますC++03。C++03 との非互換性を強制C++11するC++11 の新機能はありません。

ただし、あなたのライブラリは GGC 4.2.1 でコンパイルされているとおっしゃいました。C++11 は当時のアイデアにすぎなかったため、当時の GCC は、C++11 と互換性がないことが判明した方法で実装された可能性が非常に高いです。

たとえばstd::list::size()、C++11 では O(1) でなければなりませんが、C++03 では O(N) になる可能性があります。GCC は当時、将来の要件を知らずに O(N) 実装を選択しました。O(1) は O(N) より優れているため、現在の GCCstd::list::size実装は C++11 と C++03 の両方と互換性があります。

于 2012-02-23T11:47:04.837 に答える
3

答えは、ライブラリの API とその実装の依存関係に完全に依存します。

再コンパイルする必要がないことを保証する条件は次のとおりです。

-- あなたのライブラリは、パブリック API で C++ 固有の機能を使用していません。

これは次のことを意味します。

  1. あなたのライブラリは、クラス/クラステンプレート/関数テンプレート/その他の C++ 固有のものを提供していません。

  2. ライブラリ関数との間で C++ クラスを受け入れたり、返したりしません。

  3. 関数パラメーターを参照渡ししません。

  4. C++ 固有の実装でパブリック インライン関数を提供しません。

  5. 関数から例外をスローしません。

  6. C++ 固有のライブラリ ヘッダーをパブリック ヘッダーに含めない (理由がないため)。(インクルードしても問題ありませんが、インクルードを削除すれば問題ありません。インジケーターのようなものです。)

-- ライブラリは、新しいビルド環境で利用可能なライブラリとバイナリ互換性のあるライブラリのみに依存します。

これらの条件が満たされない場合、ライブラリが正しく動作するという保証はありません。ほとんどの場合、すべてが正しく機能することを確認するよりも、再コンパイルする方がはるかに簡単です。

いずれにせよ、上記の条件を満たすバイナリ互換の API を作るなら、C 言語の API を設計して実装したほうがずっといいです。このようにして、自動的に上記の条件を満たし、C スタイルの C++ コードを書く罪に陥ることはありません。

于 2012-02-23T08:13:54.063 に答える
1

コンパイルされたコードへのインターフェイスが C++11 によって変更されたテンプレートを使用している場合、はい、再コンパイルする必要があります。それ以外の場合は、おそらく古いライブラリを引き続き使用できます (コンパイラ プロバイダーが同時に ABI の変更を行うことを決定した場合を除きます。これは、バイナリの問題のために修正が控えられることが多い長年にわたる ABI のバグを修正する絶好の機会だからです)。非互換性)。

于 2012-02-23T07:34:47.950 に答える
1

再コンパイルせずに C++11 の大部分を使用できますが (ABI 互換性があると仮定して)、特定の重要な部分は、少なくとも私にとっては、既にコンパイルされたコードにはアクセスできません - セマンティクスを移動します。

Move セマンティクスは、C++11 コンパイラ (できれば C++11 stdlib) で再コンパイルするだけでコードを高速化できます。

他の理由もあります。お気に入りのライブラリは、最後にコンパイルしてから C++11 対応になり、C++11 コンパイラでコンパイルした方が効率的、安全、または使いやすくなっているのではないでしょうか?

独自のライブラリについては、C++11 を使用すると、より効率的で、より安全で、使いやすくすることができますか? :)

于 2012-02-23T07:27:58.387 に答える