Frage

(Ich verwende Visual C++ 2008) Ich habe immer gehört, dass main() ist erforderlich um eine Ganzzahl zurückzugeben, aber hier habe ich sie nicht eingegeben return 0; und es wurde mit 0 Fehlern und 0 Warnungen kompiliert!Im Debug-Fenster heißt es, das Programm sei mit Code 0 beendet worden.Wenn diese Funktion einen anderen Namen als main() hat, beschwert sich der Compiler, dass „blah“ einen Wert zurückgeben muss.Kleben a return; führt auch dazu, dass der Fehler auftritt.Aber wenn man es komplett weglässt, lässt es sich gut kompilieren.

#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 das ein Fehler in VC++ sein?

War es hilfreich?

Lösung

3.6.1 Hauptfunktion

....

2 Eine Implementierung darf die nicht vordefinieren main Funktion.Diese Funktion darf nicht überlastet werden.Es muss einen Rückgabetyp vom Typ haben int, aber ansonsten ist sein Typ durch die Implementierung definiert.Alle Implementierungen müssen beide der folgenden Definitionen von main zulassen:

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

Und

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

....und es kommt immer wieder hinzu ...

5 A return Aussage in main hat den Effekt, dass die Hauptfunktion verlassen wird (alle Objekte mit automatischer Speicherdauer zerstört werden) und aufgerufen wird exit mit dem Rückgabewert als Argument. Wenn die Kontrolle das Ende erreicht main Ohne auf eine Return-Anweisung zu stoßen, wird die Rückgabe 0 ausgeführt;

Ich versuche, eine Online-Kopie des C++-Standards zu finden, damit ich diese Passage zitieren kann Ich habe einen Blog-Beitrag gefunden, der die richtigen Passagen besser zitiert, als ich es könnte.

Andere Tipps

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.

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

In Abschnitt 6.6.3/2 heißt es: „Der Ablauf am Ende einer Funktion entspricht einer Rückgabe ohne Wert.Dies führt zu undefiniertem Verhalten in einer Wert zurückgebenden Funktion.

Ein Beispiel ist der folgende Code, der bestenfalls eine Warnung bei VS 2010/g++ ausgibt

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

int main(){
   f();
}

Der springende Punkt ist also, dass „main“ etwas Besonderes ist, wie die vorherigen Antworten gezeigt haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top