2013-06-04 11 views
32

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); 

?

+6

Per ulteriore confusione, 'bar (* foo);' è anche equivalente a entrambi. E così è 'bar (***** pippo);'. –

+0

Preferisco '& foo', perché questo rende esplicito che voglio un puntatore a funzione, e non mi sono semplicemente dimenticato di chiamare la funzione. – sp2danny

risposta

33

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.

8

C'è una differenza tra queste due chiamate:

No, non v'è alcuna differenza.

-2

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.

+10

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 * '). –

+3

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 ... –

Problemi correlati