2010-04-14 4 views
11

Ho cercato ma non sono riuscito a trovare alcun risultato (la mia terminologia potrebbe essere spenta) quindi perdonatemi se è stato chiesto prima.Chiamare un vuoto * come funzione senza dichiarare un puntatore di funzione

Mi chiedevo se esiste un modo semplice per chiamare un void* come funzione in C senza prima dichiarare un puntatore di funzione e quindi assegnare il puntatore alla funzione l'indirizzo;

ie. assumendo la funzione da chiamare è di tipo void(void)

void *ptr; 
ptr = <some address>; 
((void*())ptr)(); /* call ptr as function here */ 

con il codice di cui sopra, ottengo errore C2066: getto operato tipo è illegale in VC2008

Se questo è possibile, come sarebbe la sintassi differire per funzioni con tipi di ritorno e parametri multipli?

risposta

22

il cast dovrebbe essere:

((void (*)(void)) ptr)(); 

In generale, questo può essere reso più semplice la creazione di un typedef per il tipo di puntatore a funzione:

typedef void (*func_type)(void); 
((func_type) ptr)(); 

devo comunque sottolineare che esprimono un normale puntatore (puntatore a oggetto) o da un puntatore funzione non è rigorosamente legale (anche se è ac estensione ommon).

+0

Proprio quello che stavo cercando, grazie. –

12

Sono terribilmente confuso quando eseguo il casting su tipi di funzione. E 'più facile e più leggibile al typedef tipo puntatore a funzione:

void *ptr = ...; 
typedef void (*void_f)(void); 
((void_f)ptr)(); 
11

In C++: reinterpret_cast< void(*)() > (ptr)()

L'uso di reinterpret_cast consente di risparmiare un set di parentesi confuse, e il < > imposta chiaramente il tipo a parte la chiamata stessa.