Cは、現在でも最も古い言語の1つです。ABIはシンプルで、現在も使用されているほぼすべてのオペレーティングシステムが記述されています。これらのOSの一部は、たとえばC#/。NETまたはその上にあるものを追加しているかもしれませんが、その下には非常にCに浸っています。
つまり、OSが提供する機能を使用するためには、事実上すべてのプログラミング言語にCライブラリとのインターフェースが必要でした。Perl、Java、C ++、それらはすべて、ネイティブに「Cを話す」方法を提供します。なぜなら、すべての車輪を再発明したくない場合に必要だったからです。
これにより、Cはプログラミング言語のラテン語になります。(その比phorが「プログラミング言語の英語」でなければならないまでのインターネットの長さは?)
ライブラリをCで作成すると、C互換のインターフェイスが無料で得られます(明らかに)。ライブラリをC ++で記述している場合、前述の宣言を介してCバインディングを取得できextern "C"
ます。
ただし、これらのバインディングは、Cで表現できる機能に対してのみ取得できます。
したがって、ライブラリAPIは使用できません...
- テンプレート、
- クラス、
- 例外、
- オブジェクトを取得または返す関数。
簡単な例の1つとして、エクスポートされた関数に配列()の代わりに(およびその点で)を取得させて返す必要があります。[]
std::vector
std::string
そのため、C ++がライブラリのクライアントに提供する優れた機能を提供できないだけでなく、ライブラリAPIをC ++から「C互換」に「変換」するための追加努力も必要になります(extern "C"
)。
これが、Cがライブラリを実装するためのより良い選択であるということを指摘できる理由です。個人的には、C ++の利点はextern "C"
APIに必要な労力を上回っていると思いますが、それは私だけです。