2010-11-27 3 views
2

Ich habe die folgende Funktion:Compiler beschwert sich nicht über Funktion nicht Wert zurück

bool Server::ServerInit() 
{ 
// bool listenResult = socket.Listen((const uint8 *)_LOCAL_HOST, m_iPort); 
// if(true == listenResult) 
//  cout << "Server passive socket listening\n"; 
// else 
//  cout << "Server passive socket not listening\n"; 
//  
// return listenResult; 
} // ServerInit() 

diese kompiliert völlig in Ordnung, sollte aber nicht der Compiler über das Fehlen einer return-Anweisung beschweren?

EDIT 0: GNU g ++ Compiler

+1

Welchen Compiler benutzen Sie? Der Visual C++ Compiler Ich habe mich mit einem C4716 ziemlich laut über Ihren Code-Schnipsel beschwert. –

+0

@TheFuzz: Meine beschwert sich ziemlich laut wie es sollte! –

+0

Ich habe eine Bearbeitung gemacht. Ich benutze den gnu g ++ Compiler – TheFuzz

Antwort

4

Versuchen mit -Wall Option (gcc) Kompilieren [-Wreturn-type genauer sein]. Sie werden eine bekommen eine Warnung so etwas wie oder so etwas wie „no return-Anweisung in der Funktion der Rückkehr nicht-leer“

Beispiel „Steuer Ende eines nicht-Lücke Funktion erreicht“:

C:\Users\SUPER USER\Desktop>type no_return.cpp 
#include <iostream> 
int func(){} 

int main() 
{ 
    int z = func(); 
    std::cout<< z; //Undefined Behaviour 
} 
C:\Users\SUPER USER\Desktop>g++ -Wall no_return.cpp 
no_return.cpp: In function 'int func()': 
no_return.cpp:2:12: warning: no return statement in function returning non-void 

C:\Users\SUPER USER\Desktop> 

der zurück Verwendung Der Wert einer nicht-void-Funktion (die keine return-Anweisung hat) ist Undefined Behavior.

+0

-Wall ist eine der Optionen, die mein Compiler derzeit verwendet. Es klagen immer noch nicht. – TheFuzz

+2

Sie brauchen "-Wall", nicht "-Wall"; Bei den Befehlszeilenoptionen wird zwischen Groß- und Kleinschreibung unterschieden. Beachten Sie, dass "-w" "alle Warnmeldungen sperren" ist. – janm

+0

@TheFuzz Ich bekomme Folgendes, wenn ich -Wall: "test.cpp: In Mitgliedsfunktion 'bool Server :: ServerInit()': test.cpp: 14: Warnung: Kontrolle erreicht Ende der nicht-void-Funktion" – chrisaycock

1

Hier ist der Grund, warum Sie nicht bekommen, Fehler/Warnung, da es etwas ist, das als nicht definiertes Verhalten (UB)

$ 6.6.3/2 bekannt ist - „abfließende das Ende eines Funktion ist äquivalent zu einer Rückkehr ohne Wert; ergibt ich undefiniertes Verhalten in einer Wert-Rückkehr Funktion "

Leider eine saubere Zusammenstellung mit/ohne eine Warnung. Teil von jedem anderen vorstellbaren Verhalten ist alles Teil von UB.

Wie @ Prasoon erwähnt, ist "Haupt" -Funktion eine Ausnahme von dieser Regel.

+1

Fügen Sie auch hinzu, dass 'main()' eine Ausnahme von dieser Regel darstellt. ':)' –

+0

@Prasoon Saurav: Guter Punkt. Mein Beitrag wurde aktualisiert – Chubsdad