2017-09-22 14 views
1

私はCの代わりにC++ライブラリを使うほうがいいと言われてきましたが、理由は説明されていません。`extern" C "vsネイティブC++ライブラリを使用してCライブラリを使用する場合の欠点は何ですか?

CライブラリとCライブラリを使用する方が良いでしょうか?その場合はなぜですか?

C++でCライブラリを使用する際に発生する共通の問題はありますか?

+1

誰があなたに言ったのですか? –

+0

@NeilButterworthローカルのC++集会の人 – Greg

+0

私の経験上、C++ライブラリは多くの場合、割り当てを制御したり例外を使用させたりすることができないため、自分の要件に合わせてCライブラリを使用する方が良い場合がありますゲーム業界)。どの図書館が必要なのかあなた自身を判断するのはどうですか? – KABoissonneault

答えて

2

問題は、文が真であると仮定していることです。しかし、そうではありません。 C++やCライブラリの使用には問題はありません。

extern "C"は、異なる目的を持っています.C++コンパイラで関数をエクスポートすると、コンパイラはエクスポートされた関数名を「mangle」します。このように:

int f (void) { return 1; } 

はactualyとしてコンパイルされます。

int __f_v (void) { return 1; } 

そして、これはC++の動作方法です。あなたは(たとえば、Cライブラリから使用する)マングリングせずに同じ機能をエクスポートしたい場合は、操作を行います。

extern "C" int f (void) { return 1; } 

し、その後、C++コンパイラは、「輸出」は、この機能だけで同じようになりますCコンパイラが行います。

+0

名前のマングリングはさらに悪くなります。なぜなら、すべてのコンパイラが異なる方法で関数名をマングリングすることができるからです。コンパイラBで作成されたC++プロジェクトでコンパイラAを使用しているC++ライブラリのcreatadをインポートできないことを意味します(こちらを参照してください)(https://en.wikipedia.org/wiki/Name_mangling## C.2B.2B)その他の詳細については –

+1

はい。これは問題ではありません。これは起こると予想されます。 –

+0

私はあなたに同意します。ワーグナー、それがどのように動作するかを知っていれば問題はありません。私のコメントは、C++ライブラリを使用する際のさらなる問題を強調するための答えに追加されただけです。一般に、私がコンパイラXで書いている場合、私が知っているライブラリは、同じコンパイラで書かれた他のライブラリ(例えば、Visualスタジオのソリューション)でのみ共有されるので、C++の方法でシンボルをエクスポートする方が好きです。私はライブラリが他の言語/コンパイラによって消費されることを知っています。私は 'extern" C "' –

関連する問題