私は in を使用dlsym()
しC
ていますが、の戻り値をdlsym()
明示的にキャストする必要があるのか、それとも暗黙的に正しくキャストするのかという質問があります。関数は次のとおりです。
double (*(compile)(void))(double x, double y)
{
if (system("scan-build clang -fPIC -shared -g -Wall -Werror -pedantic "
"-std=c11 -O0 -lm foo.c -o foo.so") != 0) {
exit(EXIT_FAILURE);
}
void *handle;
handle = dlopen("./foo.so", RTLD_LAZY);
if (!handle) {
printf("Failed to load foo.so: %s\n", dlerror());
exit(EXIT_FAILURE);
}
foo f;
f = (foo)dlsym(handle, "foo");
if (!f) {
printf("Failed to find symbol foo in foo.so: %s\n", dlerror());
exit(EXIT_FAILURE);
}
return f;
}
この関数compile()
は値をとらず、double
入力として 2 つの を受け取り、double を返す関数へのポインターを返します。次に、共有オブジェクトをコンパイルするシステム コールを設定しますfoo.so
。次に、foo.so
で開きdlopen()
ます。次に、ヘッダーで次のように定義したタイプのオブジェクトをdlsym()
見つけfoo
て返します。foo.so
foo
typedef double (*foo)(double, double);
キャストする必要がありdlsym()
ますか?