In C/C++, se ho una delle seguenti funzioni:Do puntatori a funzione bisogno di una e commerciale
void foo();
void bar(void (*funcPtr)());
C'è una differenza tra queste due chiamate:
bar(foo);
bar(&foo);
?
In C/C++, se ho una delle seguenti funzioni:Do puntatori a funzione bisogno di una e commerciale
void foo();
void bar(void (*funcPtr)());
C'è una differenza tra queste due chiamate:
bar(foo);
bar(&foo);
?
No, non c'è alcuna differenza, poiché la funzione può essere convertita implicitamente in puntatore in funzione. Preventivo pertinente dalla norma (N3376 4.3/1).
Un lvalue del tipo di funzione T può essere convertito in un valore di preregolazione di tipo "puntatore a T." Il risultato è un puntatore a la funzione.
C'è una differenza tra queste due chiamate:
No, non v'è alcuna differenza.
bar(foo);
si chiama la versione "corta"
bar(&foo);
è come è ufficialmente fatto
punto di vista funzionale, non v'è alcuna differenza, tuttavia le opzioni di seconda è considerato "buona pratica" di più da quel è più ovvio che foo sia in realtà un puntatore a funzione e non una funzione reale.
Questo è simile a quello degli array. Se si dispone di:
int foobar[10];
poi foobar è un int *, ma si può anche fare & foobar per lo stesso risultato.
Non sono d'accordo con la tua parte "da foobar". Definito come 'int foobar [10];', 'foobar' è un' int [10] '(array di 10 ints) ma può essere _implicitamente convertito in_' int * '(puntatore a (il primo) int) secondo necessità ("decadimento dell'array"); in particolare, 'sizeof foobar' è uguale a' 10 * sizeof (int) ', non' sizeof (int *) '. E l'altra cosa, '& foobar' è un' int (*) [10] '(puntatore all'array di 10 ints), che è completamente un altro tipo (_not_ convertibile in' int * '). –
Modifica: Ma ciò che "puoi fare" è '& foobar [0]' (o '& (foobar [0])'), che, ironia della sorte, è solo una sintassi di convenienza per '& (* (foobar + 0)) ', ovvero' foobar + 0', dove 'foobar' è implicitamente convertito in un puntatore al suo primo elemento ... –
Per ulteriore confusione, 'bar (* foo);' è anche equivalente a entrambi. E così è 'bar (***** pippo);'. –
Preferisco '& foo', perché questo rende esplicito che voglio un puntatore a funzione, e non mi sono semplicemente dimenticato di chiamare la funzione. – sp2danny