2013-04-04 19 views
21

Sono imbattuto nella riga di codice mostrata sotto Penso che potrebbe essere un cast per un puntatore a funzione che restituisce vuoto e prende un puntatore vuoto, è corretto?Trasmetti il ​​puntatore alla funzione?

(void (*)(void *))SGENT_1_calc 
+0

getto SGENT_1_calc in puntatore function (pointer to void) restituzione void –

risposta

29

Sì, è corretto. Trovo che non è molto leggibile, quindi suggerisco che dichiara la firma della funzione da rilevare:

typedef void sigrout_t(void*); 

Ho anche il codifica convenzione che i tipi che terminano con rout_t sono tali tipi per le funzioni di firme. Si potrebbe il nome altrimenti, dal momento _t è un suffisso reserved da Posix

quest'ultimo a sto casting, forse chiamarlo come

((sigrout_t*) SGENT_1_calc) (someptr); 
+1

Upvoted per typedef, sono completamente d'accordo. – Joe

+0

Da un lato, il typedef rimuove la necessità di parentesi ridondanti e confuse (almeno per alcune). Dall'altro, riduce la capacità di determinare immediatamente a cosa serve il cast. Se vuoi scoprire che il cast è per un puntatore a funzione, devi cercare cosa è sigrout_t definito come ... +1 per fornire l'alternativa. – Sebivor

+0

I nomi che terminano con _t sono riservati per POSIX, vedi http://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html – satur9nine

0

Sì, è un cast come si è detto.

4

Sì lo è, la funzione dovrebbe essere simile a questo

void func(void*); 

Ma l'affermazione manca un bersaglio, dal momento che un cast a nulla è inutile. Così dovrebbe essere come

func = (void (*)(void *))SGENT_1_calc; 
0

sì, è un puntatore a funzione, che è possibile assegnare ad una funzione con proto funcname void (void *) Qui lo SGENT_1_calc può essere assegnata direttamente a func

Problemi correlati