dlsym
mengembalikan pointer ke simbol. (Seperti void*
menjadi generik.)Dalam kasus Anda, Anda harus mentransmisikannya ke penunjuk fungsi.
double (*mycosine)(double); // declare function pointer
mycosine = (double (*)(double)) dlsym(handle, "cos"); // cast to function pointer and assign
double one = mycosine(0.0); // cos(0)
Jadi ini salah satu kasus langka di mana kesalahan kompiler adalah petunjuk yang bagus.;)
C memungkinkan cast implisit dari void *
ke semua jenis penunjuk (termasuk penunjuk fungsi); C++ membutuhkan casting eksplisit. Seperti yang dikatakan leiflundgren, Anda perlu memasukkan nilai pengembalian dlsym()
ke jenis penunjuk fungsi yang Anda butuhkan.
Banyak orang menganggap sintaks penunjuk fungsi C canggung. Salah satu pola yang umum adalah mengetikkan penunjuk fungsi:
typedef double (*cosine_func_ptr)(double);
Anda dapat menentukan variabel pointer fungsi Anda cosine
sebagai anggota tipe Anda:
cosine_func_ptr cosine;
Dan transmisikan menggunakan tipe alih-alih sintaks penunjuk fungsi yang canggung:
cosine = (cosine_func_ptr)dlsym(handle, "cos");