Muszę dynamicznie łączyć funkcję biblioteki w środowisku wykonawczym w systemie Mac OS X. Po Apple's example deklaruję wskaźnik funkcji i przypisuję go z wynikiem dlsym(). Poniższy przykład kompiluje się pomyślnie jako zwykły plik C (.c). Ale muszę to w ++ pliku C, a jeśli mogę skompilować ten przykład w C++ plików (.cpp), kompilator dzyń mówi miFunkcja Przypisanie wskaźnika działa w języku C, ale nie w C++
Nie można zainicjować zmienną typu „void () (char *)” z wartością typu "void "
Dlaczego działa w prostym "C" i jak mogę to naprawić?
#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) ;
}
... a może "static_cast": http://stackoverflow.com/questions/310451/----------------------- -internet- niezależnie od tego, –
Wersja standardu C powiedziałem, że wskaźnik do 'void' może zostać przekonwertowany na lub ze wskaźnika na dowolny _object_ type' (podkreślenie dodane). Funkcja nie jest typem obiektu, a C nigdy nie zezwala na konwersje (jawne lub niejawne) między 'void *' a wskaźnikami do funkcji. Nie jestem pewien, ale myślę, że diagnostyka jest wymagana. (Nie sądzę, że jest to niezdefiniowane zachowanie.) A wyraźny rzut (nawet 'reinterpret_cast') również nie powinien działać. (Większość kompilatorów Uniksa nie jest zgodna pod tym względem, ale ponieważ jest to rozszerzenie, każdy kompilator może robić to, co mu się podoba.) –
@JamesKanze ma rację, C nie ma żadnej niejawnej konwersji z 'void *' do żadnego wskaźnika na ... typ funkcji. Odpowiedni kompilator języka C musi wystawić diagnostykę (co może być tylko ostrzeżeniem); niezgodny kompilator C, jak większość jest domyślnie, może zrobić wszystko, co mu się podoba. –