2012-06-18 8 views
7

Ich schaute auf einen Code, den mir ein Freund schickte, und er sagte: "Es kompiliert, funktioniert aber nicht". Ich sah, dass er die Funktionen ohne Klammern, etwa wie folgt verwendet:Warum meldet sich der C++ - Compiler nicht, wenn ich Funktionen ohne Klammern verwende?

void foo(){ 
    cout<< "Hello world\n"; 
} 

int main(){ 
    foo; //function without parentheses 
    return 0; 
} 

Der erste sagte, ich sei „klammern Sie müssen“. Und dann habe ich diesen Code getestet - er kompiliert, aber wenn er ausgeführt wird, funktioniert er nicht (keine "Hallo Welt").

Also, warum kompiliert es (keine Warnung vom Compiler GCC 4.7), aber funktioniert nicht?

+0

Es funktioniert tatsächlich. 'foo' wird so behandelt, wie es ist, ein Funktionszeiger. Die Zeile 'foo;' ist nur eine Zeile ohne Wirkung. Wenn Sie Ihre Warnungen auf das Maximum setzen, sollten Sie eine Warnung über eine Aussage ohne Wirkung erhalten. – RedX

+0

Ich sehe * "Warnung: Anweisung ist eine Referenz, kein Aufruf, Funktion 'foo'" * und * "Warnung: Anweisung hat keine Wirkung" *. Sie möchten wahrscheinlich mit -Wall -Wextra – Flexo

+3

kompilieren (Für zukünftige Fragen lohnt es sich, die '#include ' und alle Namespace Zeug auch, um Ihre Probe abgeschlossen) – Flexo

Antwort

12

Es warnt Sie sicherlich, wenn Sie die Warnstufe hoch genug einstellen.

Ein Funktionsname ergibt die Adresse der Funktion und ist ein zulässiger Ausdruck. Gewöhnlich wird es in einem Funktionszeiger gespeichert,

, aber das ist nicht erforderlich.

11

Sie müssen die Warnstufe erhöhen, die Sie verwenden. foo; ist eine gültige Ausdrucksanweisung (der Name einer Funktion wird in einen Zeiger auf die benannte Funktion konvertiert), hat jedoch keine Auswirkungen.

ich in der Regel -std=c++98 -Wall -Wextra -pedantic verwenden, das gibt:

<stdin>: In function 'void foo()': 
<stdin>:2: error: 'cout' was not declared in this scope 
<stdin>: In function 'int main()': 
<stdin>:6: warning: statement is a reference, not call, to function 'foo' 
<stdin>:6: warning: statement has no effect 
3
foo; 

Du bist nicht wirklich hier die Funktion 'mit'. Sie verwenden nur die Adresse. In diesem Fall nehmen Sie es, aber nicht wirklich.

Adressen von Funktionen (d. H. Ihre Namen ohne Klammern) sind nützlich, wenn Sie diese Funktion als Callback an eine andere Funktion übergeben möchten.