Come posso digitare un puntatore a funzione che accetta una funzione del proprio tipo come argomento?
-
03-07-2019 - |
Domanda
Esempio: una funzione che accetta una funzione (che accetta una funzione (che ...) e un int) e un int.
typedef void(*Func)(void (*)(void (*)(...), int), int);
Esplode ricorsivamente dove (...)
. C'è una ragione fondamentale per cui ciò non può essere fatto o c'è un'altra sintassi? Mi sembra che dovrebbe essere possibile senza un cast. Sto davvero cercando di passare una tabella di invio, ma potrei capirlo se potessi solo passare questo tipo.
Soluzione
Puoi avvolgere il puntatore a funzione in una struttura:
struct fnptr_struct;
typedef void (*fnptr)(struct fnptr_struct *);
struct fnptr_struct {
fnptr fp;
};
Non sono sicuro che si tratti di un miglioramento nel casting. Ho il sospetto che sia impossibile senza la struttura poiché C richiede che i tipi siano definiti prima di essere utilizzati e non c'è sintassi opaca per typedef.
Altri suggerimenti
È impossibile farlo direttamente. Le uniche opzioni disponibili sono fare in modo che l'argomento del puntatore a funzione accetti argomenti non specificati o accettare un puntatore a una struttura contenente il puntatore a funzione, come suggerito Dave .
// Define fnptr as a pointer to a function returning void, and which takes one
// argument of type 'pointer to a function returning void and taking
// an unspecified number of parameters of unspecified types'
typedef void (*fnptr)(void (*)());