2009-05-03 25 views
10

Esempio: una funzione che accetta una funzione (che accetta una funzione (quella ...) e una int) e una int.Come posso digitare un puntatore a funzione che accetta una funzione del proprio tipo come argomento?

typedef void(*Func)(void (*)(void (*)(...), int), int); 

esplode in modo ricorsivo in cui (...). C'è una ragione fondamentale per cui questo non può essere fatto o c'è un'altra sintassi? Mi sembra che dovrebbe essere possibile senza un cast. Sto davvero cercando di passare un dispatch-table ma potrei capirlo se potessi semplicemente passare questo tipo.

+0

Esplode in modo ricorsivo o interpreta il "..." come un vararg senza che in realtà si specifichi un argomento precedente da cui deve partire il punto vararg? –

+0

So di aver visto una domanda SO quasi esattamente come questa, ma non riesco a trovarla. –

+0

http://stackoverflow.com/q/793449/10396 – AShelly

risposta

10

si può avvolgere il puntatore a funzione in una struct:

struct fnptr_struct; 
typedef void (*fnptr)(struct fnptr_struct *); 
struct fnptr_struct { 
    fnptr fp; 
}; 

Non sono sicuro se questo è un miglioramento rispetto casting. Sospetto che sia impossibile senza la struct perché C richiede che i tipi siano definiti prima che vengano usati e non esiste una sintassi opaca per typedef.

+0

Bello che ci sia una soluzione, triste che non "funziona solo". Ah, lascito. : - / – HostileFork

6

È impossibile farlo direttamente. Le tue uniche opzioni sono di fare in modo che l'argomento del puntatore funzione accetti argomenti non specificati, o di accettare un puntatore a una struttura contenente il puntatore alla funzione, come Dave suggested.

// 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 (*)()); 
Problemi correlati