C++03 で記述されたライブラリがあり、それをスタティック ライブラリにコンパイルした場合、C++11 で使用できますか? 逆も可能です( C++03 を使用した C++11 静的ライブラリ )。
更新: 私が使用しているコンパイラは clang または LLVM です
これは主に、ライブラリで C++ 標準ライブラリをどのように使用するかによって異なります。
まったく使用しない場合、問題が発生する可能性はほとんどありません。
を使用するlibstdc++
と、いくつかの問題が発生する可能性があります。
ライブラリとの間で標準ライブラリ オブジェクトの受け渡しが常に機能するとは限りません (たとえば、std::list
C++11 モードでは、現在の C++98 モードよりも最終的に大きくなります。これは、size
データ メンバーが大きくなり、std::string
参照カウントされないものに変更されています)。g++ の開発者は、リンク時にこれらの問題をキャッチするためにシンボル汚染の形式を導入する計画を持っているため、問題のあるケースのいずれかにヒットするとエラーが発生しますが、これは g++ ではまだ実装されておらず、決して実装されない可能性があります。クラン。この問題は、ライブラリのインターフェイスに標準ライブラリの型が含まれていないことを確認することで回避できます。
一部のシンボルは意味が変わる場合があります (たとえば、 C++98 モードでは参照std::complex::real
をstd::complex::imag
返しますが、C++11 モードではconstexpr
欠陥のために値で返します)。C++98 と C++11 の両方の形式を使用して (最適化されていない) コードをリンクすると、間違った実装が選択され、実行時に奇妙な結果が生じる可能性があります。
を使用する場合libc++
、問題は発生しません。libc++
C++98 モードと C++11 モードの間でバイナリ互換性を持つように設計されています。
libc++
ライブラリとプログラムで使用する場合libstdc++
、またはその逆の場合、ほとんどの非互換性はリンク時に検出されます。(は、そのシンボルのほとんどを含むwithinをlibc++
使用するため、境界を越えて の型を渡そうとすると、リンク時に非互換性が発生します)。ただし、ライブラリのインターフェイスに標準ライブラリ タイプが間接的に含まれている場合 (たとえば、標準ライブラリ タイプをメンバーとして持つ を使用している場合)は、依然として実行時の問題が発生する可能性があります。バージョン管理を行わない型については、 (C++98 モードと C++11 モードの両方で) とのバイナリ互換性を目指しています。inline namespace
namespace std
libstdc++
struct
libc++
libstdc++
コンパイラによって異なります。たとえば、GCCは、C++11モードではABIがC++11で異なる方法で変更された識別子をマングルします。したがって、たとえば、などを使用しない場合は問題ありませんstd::list
。