Mac OS Xで実行時にライブラリ関数に動的にリンクする必要があります。Apple's exampleに続いて、関数ポインタを宣言し、dlsym()の結果を代入します。次の例では、プレーンなC(.c)ファイルとして正常にコンパイルされます。しかし、私はC++ファイルでこれを必要とする、と私はC++ファイル(.cppファイル)としてこの例をコンパイルする場合は、打ち鳴らすコンパイラは私に語っ機能ポインタの代入はC言語で行われますが、C++では動作しません
は型の変数を初期化できません「無効()(のchar *)」 'void 'の値を持つ
なぜそれはプレーンな 'C'で動作するのですか?これをどのように修正できますか?
#include <dlfcn.h>
void Test() {
// Load the library which defines myFunc
void* lib_handle = dlopen("myLib.dylib", RTLD_LOCAL|RTLD_LAZY);
// The following line is an error if compiled as C++
void (*myFunc)(char*) = dlsym(lib_handle, "myFunc");
myFunc("Hello");
dlclose(lib_handle) ;
}
...または多分 'static_cast':http://stackoverflow.com/questions/310451/should-i-use-static-cast-or-reinterpret-cast-when-casting-a-void-to- whatever –
私が持っているC標準のバージョンでは、 'void'へのポインタは' _object_ type'へのポインタに変換される可能性があります。関数はオブジェクト型ではなく、Cは 'void *'と関数へのポインタの間の変換(明示的または暗黙的な)を許さなかった。私は確信が持てませんが、診断が必要だと思います。 (私はそれが未定義の振る舞いだとは思わない)。明示的なキャスト( 'reinterpret_cast'さえ)もうまくいかないはずです。 (ほとんどのUnixコンパイラはこれに準拠していませんが、拡張機能なので各コンパイラは自由に動作します) –
@JamesKanzeが正しいです、Cは 'void *'から 'pointer-to-関数型です。準拠しているCコンパイラは、診断を発行する必要があります(これは単なる警告に過ぎません)。非適合のCコンパイラは、デフォルトでほとんどのものが好きなことをすることができます。 –