-
実行時にユーザーが
x.so
という共有オブジェクトライブラリを選択したとします。x.so
は、extern "C"
に囲まれた関数 の定義を持つcppファイルからコンパイルされました。 cppファイルのコメントでは、extern "C"
の使用は重要ですが、それ以上の説明はなく、 という説明があり、なぜですか?ここにはC++コードとCコードしかないのは間違いありませんか?だから
extern "C"
必ずしもはCとC++を混ぜるときに使われる コード一緒にですか?上記の質問に対して、ライブラリが静的または動的にC++プログラムの問題に関係するかどうかは関係ありませんか?
- さて共有オブジェクトライブラリがずっと早く実行時よりも知られている あり、そしてCの作者++プログラム がそれをコンパイルする前
dlfcn
を使用せずにC++プログラムでそれを指定する単純な場合に比較し、 は、実行時に共有オブジェクトライブラリとC++プログラム を動的にリンクします。この場合、共有オブジェクトライブラリにコンパイルされた cppファイルには `extern" C "がまだ必要ですか?
ありがとうございます。
それは暗黙のようです。 PosixはC仕様であるため、Posix APIの関数ポインタへの参照は、暗黙的にそれらがC言語リンケージを持つ関数へのポインタであると想定しています。しかし、「C言語リンケージ」という用語はC++用語です。 Cの観点からは、他の種類の関数はありません。結論は、C++のC APIを使用するときには、C言語リンケージでのみ関数を使用できることです。 –
あなたの共有ライブラリに 'int foo(int ** x、struct Bar *&y)'があれば簡単ですが、 'extern" C "'は 'dlsym(libhandle、" foo ")' 'dlsym(libhandle、" _Z3fooPPiRP3Bar ")'の代わりに、 'foo'の何らかのmanglingがあなたのプラットフォーム上で今週実施されています。実際のCコードは必要ありません。 –