2015-09-25 21 views
9

ライブラリのいくつかの "クライアント"がC++ 11のみを使用していると仮定したライブラリを構築している場合、C++ 14を使用してライブラリ自体を内部でコンパイルできますか? API/ABI /リンクの互換性に関する問題はC++ 11と比べてありますか?パブリックAPIの特定の新機能を避けている限り、C++ 14でライブラリを実装してビルドすることは安全ですか?もしそうなら、何を避けなければならないのですか?あるいは、最終的なソフトウェアプロジェクトでC++ 11とC++ 14を混在させることは本質的に両立しませんか?C++ 11を使用するライブラリでC++ 14を使用できますか?

これはクロスプラットフォームのライブラリであるため、Linux、OSX、Windowsでビルドする必要があります。

+0

C++ 14の機能を使用していなくても、クライアントが同じコンパイラバージョンを使用している限り、おそらく動作させることができます。異なるバージョンのコンパイラを使用している場合、Visual Studioを使用すると確かに動作しません。 –

+0

あなたの正確なコンパイラは何ですか?どのコンパイラがそれを消費するのですか? – Yakk

+0

OSXのClang; LinuxではClangかgccのどちらかです。 Windows上のMSVS。引数のために、ライブラリとアプリケーションの両方が同じコンパイラと同じバージョンを使用すると仮定しましょう。私の質問は、私がライブラリに対して-std = C++ 14を使用できるかどうかと、-std = c +アプリで+11、パブリックAPIが動作させるために私が覚えておく必要がある具体的な事項 –

答えて

7

ライブラリのいくつかの "クライアント"がC++ 11のみを使用していると仮定したライブラリを構築している場合、その内部用にC++ 14を使用してライブラリ自体をコンパイルできますか?

はい、一般的に可能です。

私は、GCCのファイルシステムTSの実装にぴったりです。 <experimental/filesystem>ヘッダーは純粋なC++ 11で書かれており、C++ 11クライアントに含めることができますが、libstdc++fs.aの実装はC++ 14で書かれています。

C++ 11と比べてAPI/ABI /リンクの互換性の問題はありますか?

が自分のリンク時の互換性を破るためにの実装を必要とC++ 11とC++ 14の間には変更はありません。これは実装を意味するものではありませんは壊れませんが、必須ではありません。

GCCについては、constexprと下記のサイズ変更の問題を除いて、C++ 11とC++ 14は完全にAPIとABI互換ですと考えています。

パブリックAPIの特定の新機能を避けている限り、C++でライブラリを実装してビルドすることは安全ですか?もしそうなら、どうすればよいですか?

これはコンパイラによって異なりますが、理論的には可能です。

C++ 11で有効でないC++言語機能(関数戻り型の控除、autoパラメータを持つ汎用ラムダ、変数テンプレートなど)とC++ 14ライブラリエンティティ、std::make_uniquestd::integer_sequence, or std :: shared_timed_mutex`のようになります。

C++ 14のほぼすべての変更のリストはSD-6にあります。

注意すべきは、非静的なconstexprメンバー関数の意味がC++ 11とC++ 14の間で変更されたことです。 C++ 11では、このメンバー関数は、constある:

struct X { 
    constexpr int foo(); 
}; 

C++ 14には非constです。両方のC++ 11とC++ 14と互換性を持つようにするには、明示的constとしてそれを修飾する必要があります。

struct X { 
    constexpr int foo() const; 
}; 

C++ 11とC++ 14の両方で同じことを意味します。

void operator delete(void*, std::size_t); 

C++ 11クライアントコードは、その関数を定義している場合、あなたのライブラリはC++ 14でコンパイル:

もう一つ注意すべき点は、C++ 11とC++ 14には、この演算子が別の何かを意味していることですは通常のoperator delete(void*)の代わりにそれを呼び出すことになり、おそらく間違ったことになります。これはおそらくであり、実際のコードではまったく問題はありませんが、可能です。 G ++とClangを使用すると、C++ 14のコードを-fno-sized-deallocationでコンパイルして新しい機能を無効にすることができます。これにより、C++ 14のライブラリコードは決してそのバージョンのoperator deleteを呼び出すことはありません。

関連する問題