2008-08-22 18 views
33

(Ich benutze Visual C++ 2008) Ich habe immer gehört, dass Main() ist erforderlich, um eine ganze Zahl zurück, aber hier habe ich nicht return 0; und und kompiliert mit 0 Fehler und 0 Warnungen! Im Debug-Fenster wird angezeigt, dass das Programm mit Code 0 beendet wurde. Wenn diese Funktion anders als main() benannt ist, beschwert sich der Compiler und sagt, dass 'blah' einen Wert zurückgeben muss. Das Anhaften eines return; verursacht auch den Fehler angezeigt. Aber es komplett auslassen, kompiliert es einfach gut.Warum kompiliert int main() {}?

#include <iostream> 
using namespace std; 

int main() 
{ 
    cout << "Hey look I'm supposed to return an int but I'm not gonna!\n"; 
} 

Könnte dies ein Fehler in VC++ sein?

Antwort

69

3.6.1 Hauptfunktion

....

2 Eine Implementierung muss die main Funktion nicht vordefinieren. Diese Funktion darf nicht überlastet werden. Es muss einen Rückgabetyp vom Typ int haben, ansonsten ist der Typ implementierungsdefiniert. Alle Implementierungen müssen die beiden folgenden Definitionen der Haupt erlauben:

int main() { /* ... */ } 

und

int main(int argc, char* argv[]) { 
/* ... */ 
} 

.... und es geht weiter hinzuzufügen ...

5 A return Aussage in main hat der Effekt, die Hauptfunktion zu verlassen (alle Objekte mit automatischer Speicherdauer zu zerstören) und mit dem Rückgabewert als Argument aufzurufen. Wenn die Steuerung das Ende von main erreicht, ohne auf eine Rückgabeanweisung zu stoßen, führt dies zur Ausführung der Rückgabe 0;

versucht, eine Online-Kopie des C++ Standard zu finden, so könnte ich zitiere diese Stelle I found a blog post that quotes all the right bits better than I could.

+0

g ++ wird standardmäßig einen Fehler bei Ihnen auslösen. die meisten anderen Compiler geben "0 zurück" statt – wakingrufus

+3

Ältere Versionen von GCC haben in einigen Fällen tatsächlich einen Fehler zurückgegeben, wenn Sie in main() keine return-Anweisung hatten. –

+9

@wakingrufus, welche Version von g ++ verwendest du? Ich bekomme das richtige Verhalten, wie von Sparkes beschrieben. – Kevin

3

Ich bin mir ziemlich sicher, dass VC++ nur eine Rückgabe 0 einfügt, wenn Sie keine in Hauptfunktionen enthalten. Das Gleiche kann auch mit Funktionen passieren, aber in diesen Fällen erhalten Sie zumindest eine Warnung.

+5

Es ist undefiniertes Verhalten, vom Ende einer nicht void-Funktion abzufallen. Nur Main ist speziell mit impliziter Rückgabe. –

17

Dies ist Teil des C++ - Sprachstandards. Eine implizite Rückgabe 0 wird für Sie generiert, wenn in main keine explizite Rückgabeanweisung vorhanden ist.

1

Abschnitt 6.6.3/2 Staaten- „das Ende einer Funktion mit nicht zu einer Rückkehr entspricht abfließende Wert; dies führt zu undefiniertem Verhalten in einer Wert zurückgebenden Funktion. ".

Ein Beispiel ist der Code, unter der im besten Fall gibt auf VS 2010 Warnung/g ++

int f(){ 
    if(0){ 
     if(1) 
     return true; 
    } 
} 

int main(){ 
    f(); 
} 

So ist der springende Punkt ist, dass ‚Haupt‘ Sonder ist als die bisherigen Antworten darauf hingewiesen haben.