2015-08-18 11 views
6

Per fare un typedef per un puntatore a funzione, facciamo qualcosa di simile,Esiste una sintassi alternativa ai puntatori di funzione typedef?

typedef int (*func) (char*); 
typedef struct{ 
    char * name; 
    func f1; 
} 

Al contrario di questo, mi sono imbattuto in un codice, che non capisco.

typedef int rl_icpfunc_t (char *); 
typedef struct { 
    char *name;   /* User printable name of the function. */ 
    rl_icpfunc_t *func; /* Function to call to do the job. */ 
    char *doc;   /* Documentation for this function. */ 
}COMMAND; 

Questo è uno snippet di codice da un esempio della libreria libedit. Qualcuno può spiegarmelo per favore?

+0

È una funzione int che utilizza un parametro char *. – cup

risposta

7
typedef int rl_icpfunc_t (char *); 

si definisce un prototipo di funzione come tipo.

rl_icpfunc_t * func; 

definisce func essere un puntatore alla prima.

Questo è in contrasto con definizione di un tipo di puntatore funzione direttamente attraverso:

typedef int (*prl_icpfunc_t) (char *); 
prl_icpfunc_t func; 

Il risultato di entrambi approches è lo stesso: Un puntatore func, indicando una funzione che restituisce int e prendendo un argomento, che è a char*.

+0

Puoi spiegarci un po 'di più? Stai dicendo che il secondo scenario è una situazione di errore? – Ankit

+0

@Ankit: entrambi gli approcci per definire un puntatore di funzione sono validi. – alk

+0

@Ankit: vedere la mia risposta aggiornata. – alk

3

E 'corretto utilizzare typedef int rl_icpfunc_t (char *);?

Sì, ciò significa che rl_icpfunc_t è una funzione che accetta un puntatore a char e restituisce e int. È possibile utilizzare rt_icpfunct_t in luogo di un tipo normale, così rl_icpfunc_t *func significa che func è un puntatore alla funzione del tipo rt_icpfunct_t

+0

La differenza è che nel secondo scenario mentre si esegue typedef rl_icpfunc_t viene utilizzato invece di (* rl_icpfunc_t). E poi viene usato come rl_icpfunc_t * func, piuttosto che rl_icpfunc_t func. Questo è il mio dubbio. È permesso? O significa qualcosa di diverso? – Ankit

+0

Cosa non ti è chiaro? Il puntatore di funzione dichiarato all'interno della struttura 'COMMAND'? – artm

+0

sì, voglio dire è corretto usare ** typedef int rl_icpfunc_t (char *); **? – Ankit