2014-09-20 7 views
5

Così Diciamo che ho una funzione:funzione di callback: differenza tra void (* func) (int) e vuoto (func) (int)

void foo (int i){ 
    cout << "argument is: " << i << endl; 
} 

E sto passando questa funzione per:

void function1 (void(callback)(int), int arg){ 
    callback(arg); 
} 

void function2 (void(*callback)(int), int arg){ 
    callback(arg); 
} 

queste due funzioni sono identiche? C'è qualche differenza tra i due?

+2

Esattamente identico. I tipi di funzione nei parametri sono adattati ai puntatori. –

+0

Lo stesso accordo con il dichiarare una funzione che accetta 'int * x' vs.' int x [] '; non è possibile passare funzioni o array in base al valore; la versione senza un esplicito '*' è solo zucchero sintattico per la versione puntatore. – ShadowRanger

risposta

1

Sono identici. Il parametro con il tipo di una funzione viene convertito in puntatore al tipo di funzione.

3

La regola è che in un elenco di parametri di una funzione, un parametro dichiarato di avere un tipo di funzione viene regolato in modo da avere un puntatore al tipo di funzione (analogamente, e probabilmente più noto, un parametro dichiarato di avere tipo "array di T "viene regolata per avere tipo 'puntatore a T' parentesi ridondanti dichiaratori sono autorizzati, ma ignorato

Così, in

void function1 (void(callback)(int), int arg); 
void function2 (void (*callback)(int), int arg); 
void function3 (void callback(int), int arg); 

il primo parametro di queste tre funzioni hanno esattamente lo stesso tipo -.". puntatore alla funzione di (int) restituendo void ".