2012-01-04 33 views
5

Come dichiarare un puntatore a una funzione che restituisce un altro puntatore a funzione? Si prega di condividere con me la sintassi e uno snippet di codice di esempio.Sintassi per un puntatore a una funzione che restituisce un puntatore a funzione in C

Inoltre, in quale scenario si utilizzerà un puntatore a funzione che restituisce un puntatore a funzione?

+3

Si prega di non aggiungere il nome alla fine dei post in quanto la tua firma apparirà automaticamente alla fine dei post! http://stackoverflow.com/faq#signatures –

+0

Ho ottimizzato il titolo e il testo per renderli più comprensibili. Ovviamente, sei libero di reinserirlo se non ti piacciono le modifiche, ma ti suggerirei di considerare attentamente la differenza in quanto potrebbe chiarire un po 'il problema. La dichiarazione – dmckee

risposta

9

Questo è banale con typedefs:

typedef int(*FP0)(void); 
typedef FP0(*FP1)(void); 

FP1 è il tipo di un puntatore a una funzione che restituisce un puntatore a funzione di tipo FP0.

Per quanto riguarda quando questo è utile, beh, è ​​utile se si ha una funzione che restituisce un puntatore a funzione e occorre ottenere o memorizzare un puntatore a questa funzione.

+0

va bene, ma puoi darmi uno snippet di codice che usa il puntatore alla funzione e restituisce un puntatore funtion. questo mi aiuterebbe a capire chiaramente. Inoltre, dammi la sintassi con e senza typedef .. – vijayanand1231

+0

I typedef non sono sempre fattibili. Cioè quando non si dispone di un compilatore che utilizza alias modello e si desidera restituire un puntatore a funzione da un _function template_ e la firma restituita dipende da un argomento modello. (Puoi "aggirarlo" usando un "tratto di identità") – sehe

+0

PS. Ovviamente, i tipi di ritorno in ritardo C++ 11 :) 'modello <...> auto foo() -> int (*) (void)' funzionerebbe perfettamente – sehe

5

Se si evita di utilizzare typedef, è difficile. Ad esempio, si consideri signal() dallo standard C:

extern void (*signal(int, void (*)(int)))(int); 

void handler(int signum) 
{ 
    ... 
} 

if (signal(SIGINT, SIG_IGN) != SIG_IGN) 
    signal(SIGINT, handler); 

Utilizzando typedef, è più facile:

typedef void Handler(int); 
extern Handler *signal(int, Handler *); 

void handler(int signum) 
{ 
    ... 
} 

if (signal(SIGINT, SIG_IGN) != SIG_IGN) 
    signal(SIGINT, handler); 

Si noti che per la funzione signal(), si sarebbe normalmente sufficiente utilizzare <signal.h> e lasciare che la preoccupazione di sistema su dichiarandolo.

+1

Nell'esempio typedef, non dovrebbe essere definito il gestore usando (* Handler), e quindi segnale come segnale di gestore esterno (int, Handler)? La sintassi del puntatore di funzione in C è un pasticcio, IMHO, ha due distinte sintassi che funzionano esattamente allo stesso modo. – Spidey

+1

@Spidey: ciò che suggerisci è il modo più tipico per farlo, probabilmente, ma anche quello che viene mostrato funziona correttamente. Il vantaggio è che puoi vedere il puntatore nelle dichiarazioni. Entrambi funzionano. –

+0

Freddo. Ciò che mi turba di più è che (main == & main) è vero. Probabilmente è così per compatibilità con la vecchia base di codice, ma se dovessi definire uno standard di codice, sarebbe il primo punto che sarei sicuro di rendere esplicita quale notazione essere usata. – Spidey

1

Se non si desidera un secondo typedef,

typedef float(*(*fptr_t)(int))(double) 

questo significa "declare fptr_t as pointer to function (int) returning pointer to function (double) returning float" (fptr_t: int → (doppia → float))

+0

La dichiarazione ha un bell'aspetto, ma non è sicura riguardo all'assegnazione e al richiamo del funciton utilizzando questo puntatore. È lo stesso del normale richiamo del puntatore a funzione? Inoltre, pls mi dà un frammento di codice che mi fa capire molto chiaramente. – vijayanand1231

Problemi correlati