Ho bisogno di collegarmi dinamicamente ad una funzione di libreria in fase di esecuzione in Mac OS X. Seguendo Apple's example, dichiaro un puntatore a funzione e lo assegno con il risultato di dlsym(). Il seguente esempio si compila correttamente come un semplice file C (.c). Ma ho bisogno di questo in un file C++, e se compilo questo esempio come C++ di file (cpp), il compilatore clang mi diceL'assegnazione del puntatore funzione funziona in C ma non in C++
Impossibile inizializzare una variabile di tipo 'void () (char *)' con un valore di tipo 'void '
Perché funziona in semplice 'C' e come posso risolvere questo problema?
#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) ;
}
... o forse 'static_cast': http://stackoverflow.com/questions/310451/should-i-use-static-cast-or-reinterpret-cast-when-casting-a-void-to- qualunque sia la –
La versione dello standard C ho detto che un puntatore a 'void' può essere convertito in o da un puntatore a qualsiasi tipo _object_' (enfasi aggiunta). Una funzione non è un tipo di oggetto e C non ha mai consentito conversioni (esplicite o implicite) tra 'void *' e puntatori a funzioni. Non sono sicuro, ma penso che sia necessaria una diagnosi. (Non penso che sia un comportamento indefinito.) E il cast esplicito (anche 'reinterpret_cast') non dovrebbe funzionare neanche. (La maggior parte dei compilatori Unix non sono conformi a questo proposito, ma poiché è un'estensione, ogni compilatore è libero di fare ciò che gli piace.) –
@JamesKanze ha ragione, C non ha alcuna conversione implicita da 'void *' a nessun puntatore-a- tipo di funzione. Un compilatore C conforme deve emettere una diagnostica (che può essere solo un avvertimento); un compilatore C non conforme, come la maggior parte di default, può fare qualsiasi cosa voglia. –