Frage

Was ist die richtige Signatur der main Funktion in C ++? Was ist der korrekte Rückgabetyp und was bedeutet es, einen Wert von main zurückzukehren? Was sind die zulässigen Parameter-Typen, und was sind ihre Bedeutungen?

Ist das systemspezifische? Haben diese Regeln im Laufe der Zeit verändert? Was passiert, wenn ich sie verletzen?

War es hilfreich?

Lösung

Die main Funktion muss als Nicht-Mitglied-Funktion im globalen Namensraum deklariert werden. Dies bedeutet, dass es nicht eine statische oder nicht-statische Elementfunktion einer Klasse sein kann, noch kann es in einem Namensraum (auch der unbenannte Namensraum) aufgestellt werden.

Der Name main reserviert ist nicht in C ++, außer als eine Funktion im globalen Namespace. Sie sind frei, andere Einheiten main genannt zu erklären, einschließlich unter anderen Klassen, Variablen, Aufzählungen, Member-Funktionen und nicht-Member-Funktionen nicht im globalen Namespace.

Sie können eine Funktion mit dem Namen main als Member-Funktion oder in einem Namensraum deklarieren, aber eine solche Funktion wäre die main Funktion, dass Bezeichnet nicht dort, wo das Programm startet.

Die main Funktion kann nicht als static oder inline deklariert werden. Es kann auch nicht überlastet werden; es kann nur eine Funktion mit dem Namen main im globalen Namespace sein.

Die main Funktion kann nicht in Ihrem Programm verwendet werden. Sie sind nicht die main Funktion von überall in Ihrem Code zu nennen erlaubt, noch darf man seine Adresse nehmen

Der Rückgabetyp main muss int . Kein anderer Rückgabetyp ist erlaubt (diese Regel in fett ist, weil es sehr häufig falsche Programme zu sehen, dass declare main mit dem Rückgabetyp void, das ist wahrscheinlich die am häufigsten verletzten Regel über die main Funktion)

.

Es gibt zwei Erklärungen von main, die erlaubt sein muss:

int main()               // (1)
int main(int, char*[])   // (2)

(1) gibt es keine Parameter.

(2) gibt es zwei Parameter, und sie werden üblicherweise argc und argv benannt sind. argv ist ein Zeiger auf ein Feld von C-Strings, die die Argumente für das Programm. argc ist die Anzahl der Argumente in der argv Array.

Normalerweise enthält argv[0] den Namen des Programms, aber das ist nicht immer der Fall. argv[argc] ist garantiert ein Null-Zeiger sein.

Beachten Sie, dass da ein Array-Typ Argument (wie char*[]) ist wirklich nur ein Zeigertyp Argument in der Verkleidung, die folgend beide sind beide erfolgreiche Art und Weise zu schreiben (2) und sie bedeuten beide genau die gleiche Sache:

int main(int argc, char* argv[])
int main(int argc, char** argv)

Einige Implementierungen können andere Typen und die Anzahl von Parametern ermöglichen; Sie müßten die Dokumentation Ihrer Implementierung überprüfen, um zu sehen, was es unterstützt.

main() wird voraussichtlich Null zurück Erfolg anzuzeigen und nicht-Null, um anzuzeigen, Versagen. Sie sind nicht eine return Anweisung in main() explizit schreiben erforderlich: Wenn Sie main() Rückkehr ohne eine explizite return Aussage lassen, ist es das gleiche, als wenn Sie return 0; geschrieben hatte. Die folgenden zwei main() Funktionen haben das gleiche Verhalten:

int main() { }
int main() { return 0; }

Es gibt zwei Makros, EXIT_SUCCESS und EXIT_FAILURE, definiert in <cstdlib>, die auch von main() zurückgeführt werden kann Erfolg und Misserfolg anzuzeigen sind.

Der Wert von main() zurückgegeben wird, an die exit() Funktion übergeben, die das Programm beendet wird.

Beachten Sie, dass all dies nur gilt, wenn für eine gehostete Umgebung Kompilieren (informell, einer Umgebung, wo Sie eine vollständige Standard-Bibliothek haben, und es ist ein OS Ihr Programm ausgeführt wird). Es ist auch möglich, ein C ++ Programm für eine freistehende Umgebung (zum Beispiel einiger Arten von Embedded-Systemen) zu kompilieren, wobei Start und Beendigung sind ganz Implementierung definiert und eine main() Funktion nicht einmal erforderlich. Wenn Sie schreiben C ++ für einmodernes Desktop-Betriebssystem, obwohl Sie für eine gehostete Umgebung zu kompilieren.

Andere Tipps

Von Standard-docs. 3.6.1.2 Hauptfunktion

  

Es ist eine Rückkehr haben   Typ vom Typ int, aber sonst seine Art ist die Implementierung definiert. Alle Implementierungen sind beide der folgenden erlauben   Definitionen der Haupt:

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

  

In der letzteren Form argc ist die Anzahl der Argumente für das Programm übergeben wird von der Umgebung, in der die   Programm ist run.If argc ist ungleich Null Diese Argumente werden in argv geliefert werden [0] bis argv [argc-1] als Zeiger auf   die ersten Zeichen von nullterminierten Multibyte Strings .....

Ich hoffe, das hilft ..

Der genaue Wortlaut der neuesten veröffentlichten Standard (C ++ 14):

  

Eine Implementierung wird sowohl

erlauben      
      
  • eine Funktion von () Rückkehr int und

  •   
  • eine Funktion von (int, Zeiger auf Zeiger auf char) Rückkehr int

  •   
     

als Typ des main.

Dies macht deutlich, dass alternative Schreibweisen zulässig sind, solange die Art der main ist der Typ int() oder int(int, char**). So ist die folgende, sind zulässig:

  • int main(void)
  • auto main() -> int
  • int main ( )
  • signed int main()
  • typedef char **a; typedef int b, e; e main(b d, a c)

Die zwei gültigen Netze sind int main() und int main(int, char*[]). Jede Sache, sonst kann oder nicht kompilieren. Wenn main kehrt nicht explizit einen Wert, 0 wird implizit zurückgegeben.

Details über die Rückgabewerte und deren Bedeutung

Pro 3.6.1 ([basic.start.main]):

  

Eine return-Anweisung in main hat den Effekt des Ausscheiden aus der main Funktion (alle Objekte mit automatischer Speicherdauer zu zerstören) und rufe std::exit mit dem Rückgabewert als Argument. Wenn die Steuerung das Ende main erreicht, ohne eine return Aussage trifft, ist der Effekt, dass die Ausführung

return 0;

Das Verhalten von std::exit wird detailliert in Abschnitt 18.5 ([support.start.term]) und beschreibt den Statuscode:

  

Schließlich wird die Steuerung an die Host-Umgebung zurück. Wenn der Status Null oder EXIT_SUCCESS ist, eine Implementierung definierte Form der Status erfolgreichen Beendigung zurückgegeben. Wenn der Status EXIT_FAILURE ist, eine Implementierung definiert Form der Status erfolglosen Beendigung zurückgegeben. Ansonsten kehrte der Status ist die Implementierung definiert.

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