Was ist die richtige Erklärung der wichtigsten?
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?
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ückkehrint
undeine Funktion von
(int
, Zeiger auf Zeiger aufchar)
Rückkehrint
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 dermain
Funktion (alle Objekte mit automatischer Speicherdauer zu zerstören) und rufestd::exit
mit dem Rückgabewert als Argument. Wenn die Steuerung das Endemain
erreicht, ohne einereturn
Aussage trifft, ist der Effekt, dass die Ausführungreturn 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 StatusEXIT_FAILURE
ist, eine Implementierung definiert Form der Status erfolglosen Beendigung zurückgegeben. Ansonsten kehrte der Status ist die Implementierung definiert.