2013-06-04 4 views
32

In C/C++, wenn ich eine habe folgende Funktionen:Do Funktionszeiger benötigen eine kaufmännische

void foo(); 
void bar(void (*funcPtr)()); 

Gibt es einen Unterschied zwischen diesen beiden Anrufen:

bar(foo); 
bar(&foo); 

?

+6

Für zusätzliche Verwirrung, 'bar (* foo);' ist auch äquivalent zu diesen beiden. Und so ist 'bar (***** foo);'. –

+0

Ich bevorzuge '& foo', weil dies explizit macht, dass ich einen Funktionszeiger möchte, und nicht einfach vergessen habe, die Funktion aufzurufen. – sp2danny

Antwort

33

Nein, es gibt keinen Unterschied, da die Funktion implizit in einen Zeiger umgewandelt werden kann, um zu funktionieren. Relevantes Zitat aus der Norm (N3376 4.3/1).

ein L-Wert von T Funktionstyp kann mit einem prvalue des Typs „Zeiger auf T.“ Das Ergebnis umgewandelt werden, ist ein Zeiger auf die Funktion .

8

Gibt es einen Unterschied zwischen diesen beiden Anrufen:

Nein, es gibt keinen Unterschied.

-2

bar(foo); ist die „kurze“ Version

bar(&foo); genannt wird, wie es offiziell

Funktionell gemacht wird, gibt es keinen Unterschied, aber die zweiten Optionen in Betracht gezogen wird „good practice“ von den meisten da, dass So ist es offensichtlich, dass foo eigentlich ein Funktionszeiger und keine eigentliche Funktion ist.

Dies ist ähnlich wie bei Arrays. Wenn Sie:

int foobar[10]; 

dann ist foobar ein int *, aber Sie können auch & foobar für das gleiche Ergebnis tun.

+10

Ich stimme nicht mit Ihrem "Foobar" -Teil überein. Definiert als 'int foobar [10];', 'foobar' ist ein' int [10] '(Array von 10 ints), kann aber _implizit in _int *' (Zeiger auf (das erste) int) konvertiert werden "Array verfällt"); insbesondere ist "sizeof foobar" gleich "10 * sizeof (int)", nicht "sizeof (int *)". Und die andere Sache, '& foobar' ist ein' int (*) [10] '(Zeiger auf ein Array von 10 Ints), der ein ganz anderer Typ ist (_nicht_ konvertierbar zu' int * '). –

+3

Edit: Aber was du "tun kannst" ist '& foobar [0]' (oder '& (foobar [0])'), was ironischerweise nur eine Bequemlichkeitssyntax für '& (* (foobar + 0) ist) ', dh' foobar + 0', wobei 'foobar' implizit in einen Zeiger auf das erste Element konvertiert wird ... –