回答:
インターフェースとして公開されるライブラリの部分は、言語のC「部分」のみを使用するため、クラスや同様の関数、POD、およびPODを含む構造体のみをエクスポートするわけではありません。さらに、C ++の名前のマングリングを無効にする必要があります。これは通常、関数をとしてマークすることによって実現されextern "C"
ます。典型的な例は次のとおりです。
extern "C" void foo(int bar);
この方法でライブラリを公開することの大きな利点は、ほとんどすべてのプログラミング言語がCライブラリと直接インターフェイスするメカニズムを備えていることですが、C ++ライブラリと直接インターフェイスできるのはごくわずかです。その意味で、他の人がライブラリを簡単に使用できるようにするために、最小公分母を選択します。
ただし、他の人が使用するライブラリを作成している場合、これは本当に有用な戦略にすぎないことに注意してください。C ++のみのソフトウェアを構築していて、ライブラリが相互にインターフェースするだけでよい場合は、適切なC ++ APIを公開して、言語の能力を最大限に活用することをお勧めします。
extern "C"
入手できなかったものの例を教えていただけますか?
.hpp
が、この拡張機能は「C ++ヘッダーファイル」を意味する.h
ため、CとC ++の両方に使用される必要があります。
Timoの答えに加えて、一部のプラットフォーム(Windows-Mac OS XのLinuxのように広く採用されているものなど)には標準化されたC ++ ABIがないため、機能の欠落だけでなく、そのような機能を実装することは不可能です
たとえば、IIRC MSVCは各バージョンで異なるABIを持ち、デバッグかリリースビルドかによって変わる可能性があり、公開されていないため、サードパーティのコンパイラは通常互換性がありません(一部のバージョンのiccはMSVCと互換性があるという情報を読んでいます) 2005年ですが、NDAで開示された情報である可能性があります(Pythonの作成者が利用できる必要はありません)。独自のABIを使用します。そのため、実際には言語環境はコンパイラのバージョンだけでなくフラグも制限します。
最後に、C ++にはさらに多くのコンパイル時機能があります。たとえば、ジェネリックは通常、動的に型付けされた言語などには存在しません。