web-dev-qa-db-ja.com

C ++コードをC APIとして公開することは何を意味し、それを行う利点は何ですか?

C++プログラマーはライブラリ/製品のパブリックAPIをC APIとして公開するべきだと人々が言うのをよく耳にします。

それは何を意味し、その利点は何ですか?

26
Daniel Ribeiro

これは、インターフェイスとして公開されているライブラリの部分が言語のCの「部分」のみを使用することを意味するので、クラスや同様の関数、POD、およびPODを含む構造体のみをエクスポートしません。さらに、C++名のマングリングを無効にする必要があります。これは、通常、関数をextern "C"としてマークすることによって実現されます。典型的な例は次のとおりです。

extern "C" void foo(int bar);

この方法でライブラリを公開することの大きな利点は、ほとんどすべてのプログラミング言語がCライブラリと直接インターフェースするメカニズムを備えていることですが、C++ライブラリと直接インターフェースできるのはごくわずかです。したがって、その意味で、あなたは他の人があなたのライブラリを簡単に使用できるようにするために、最も低い共通分母を求めます。

ただし、これは他の人が使用するライブラリを作成する場合にのみ、実際に役立つ戦略であることを覚えておいてください。 C++のみのソフトウェアを構築していて、ライブラリーが相互にインターフェースするだけでよい場合は、適切なC++ APIを公開することで(私見)、言語の能力を最大限に活用できるようになります。

44
Timo Geusch

Timoの回答に加えて-一部のプラットフォーム(たとえば、Windows-広く採用されているMac OS XのLinuxなど)には標準化されたC++ ABIがないため、機能が不足しているだけでなく、そのような機能を実装できない可能性があります。

たとえば、IIRC MSVCは各バージョンで異なるABIを持ち、それがデバッグビルドかリリースビルドかによって変化する可能性があります-そしてそれは公開されていないため、サードパーティのコンパイラーは通常互換性がありません(iccの一部のバージョンはMSVCと互換性があるという情報を読んでいます2005 =しかし、それはNDA-言うまでもなくPythonの作成者に利用可能ではない)で開示された情報であり、独自のABIを使用する可能性があります。したがって、実際の言語環境では、コンパイラのバージョンだけでなくフラグも制限されます。

最後に、C++にははるかに多くのコンパイル時機能があります。たとえば、ジェネリックは通常、動的に型付けされた言語などには存在しません。

8