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


25

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

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

回答:


44

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

extern "C" void foo(int bar);

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

ただし、他の人が使用するライブラリを作成している場合、これは本当に有用な戦略にすぎないことに注意してください。C ++のみのソフトウェアを構築していて、ライブラリが相互にインターフェースするだけでよい場合は、適切なC ++ APIを公開して、言語の能力を最大限に活用することをお勧めします。


14
スローされた例外もエクスポートしないように注意する必要があります!
ジェームズ

それは素晴らしい答えです。extern "C"入手できなかったものの例を教えていただけますか?
ダニエルリベイロ

1
@DanielRibeiro:「extern C」をグーグルで検索してください。次のようなリンクがあります:stackoverflow.com/questions/1041866/…–
Doc Brown

1
@DanielRibeiro、非常に簡単な例が追加されました。
ティモゲーシュ

1
@DanielRibeiroを使用することは技術的に可能です.hppが、この拡張機能は「C ++ヘッダーファイル」を意味する.hため、CとC ++の両方に使用される必要があります。
リーム

8

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

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

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


2
@DanielRibeiro:C ++ ABIの素晴らしい地獄へようこそ(en.wikipedia.org/wiki/Application_binary_interface)。短いバージョンでは、C ++コンポーネントを個別にコンパイル(異なるコンパイラ/フラグでコンパイル)して、静かに失敗/クラッシュするのではなく、連携して動作させるのは非常に困難です。
マチェイピエチョトカ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.