2012-06-18 23 views
7

Szukałem jakiegoś kodu, który przysłał mi przyjaciel, a on powiedział: "Kompiluje, ale nie działa". Widziałem, że użył funkcji bez nawiasów, coś takiego:Dlaczego kompilator C++ nie narzeka, gdy używam funkcji bez nawiasów?

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

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

Pierwszy Powiedziałem tylko „stosowanie nawiasów, trzeba”. A potem przetestowałem ten kod - kompiluje się, ale po uruchomieniu nie działa (nie wyświetla się "Witaj świecie").

Dlaczego więc się kompiluje (brak ostrzeżenia z kompilatora GCC 4.7), ale nie działa?

+0

To faktycznie działa. 'foo' jest traktowane tak, jak jest, wskaźnikiem funkcji. Linia 'foo;' jest po prostu linią bez efektu. Jeśli zmienisz ostrzeżenia na maksimum, powinieneś otrzymać ostrzeżenie o wyciągu bez skutku. – RedX

+0

Widzę * "ostrzeżenie: instrukcja to odwołanie, a nie wywołanie, do funkcji" foo "" * i * "ostrzeżenie: instrukcja nie ma wpływu" *. Prawdopodobnie chcesz skompilować z opcją -Wall -Wextra – Flexo

+3

(W przypadku przyszłych pytań warto wstawić też "#include " i dowolną przestrzeń nazw, aby przygotować próbkę) – Flexo

Odpowiedz

12

Ostrzega przed ustawieniem wystarczająco wysokiego poziomu ostrzeżenia.

Nazwa funkcji odpowiada adresowi funkcji i jest wyrażeniem prawnym. Zwykle jest zapisywany w wskaźniku funkcji, ale nie jest to wymagane.

11

Należy zwiększyć poziom ostrzeżenia, którego używasz. foo; jest poprawną instrukcją wyrażenia (nazwa funkcji zamienia się na wskaźnik do nazwanej funkcji), ale nie ma ona żadnego efektu.

Zwykle używam -std=c++98 -Wall -Wextra -pedantic co daje:

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

Nie jesteś rzeczywiście 'za pomocą' funkcji tutaj. Używasz tylko jego adresu. W tym przypadku bierzesz to, ale nie używasz go naprawdę.

Adresy funkcji (tj. Ich nazwy, bez nawiasów) są przydatne, gdy chcemy przekazać tę funkcję jako funkcję zwrotną do innej funkcji.

Powiązane problemy