Was ist die richtige Signatur der main
Funktion in C ++? Was ist der richtige Rückgabetyp und was bedeutet es, einen Wert von zurückzugeben main
? Was sind die zulässigen Parametertypen und welche Bedeutung haben sie?
Ist das systemspezifisch? Haben sich diese Regeln im Laufe der Zeit geändert? Was passiert, wenn ich sie verletze?
main
in C und C ++ zurückgegeben werden soll , oder ist ein Duplikat davon .Antworten:
Die
main
Funktion muss im globalen Namespace als Nichtmitgliedsfunktion deklariert werden. Dies bedeutet, dass es weder eine statische oder nicht statische Elementfunktion einer Klasse sein noch in einem Namespace (auch nicht im unbenannten Namespace) platziert werden kann.Der Name
main
ist in C ++ nur als Funktion im globalen Namespace reserviert. Es steht Ihnen frei, andere benannte Entitäten zu deklarierenmain
, darunter unter anderem Klassen, Variablen, Aufzählungen, Elementfunktionen und Nichtmitgliedsfunktionen, die nicht im globalen Namespace enthalten sind.Sie können eine Funktion
main
als Elementfunktion oder in einem Namespace deklarieren , aber eine solche Funktion ist nicht diemain
Funktion, die angibt, wo das Programm startet.Die
main
Funktion kann nicht alsstatic
oder deklariert werdeninline
. Es kann auch nicht überladen werden;main
Im globalen Namespace kann nur eine Funktion benannt sein .Die
main
Funktion kann in Ihrem Programm nicht verwendet werden: Sie dürfen diemain
Funktion weder von einer beliebigen Stelle in Ihrem Code aus aufrufen noch ihre Adresse übernehmen.Der Rückgabetyp von
main
muss seinint
. Es ist kein anderer Rückgabetyp zulässig (diese Regel ist fett gedruckt, da häufig falsche Programmemain
mit einem Rückgabetyp von deklariert werdenvoid
. Dies ist wahrscheinlich die am häufigsten verletzte Regel in Bezug auf diemain
Funktion).Es gibt zwei Erklärungen
main
, die erlaubt sein müssen:In (1) gibt es keine Parameter.
In (2) gibt es zwei Parameter , und sie werden in herkömmlicher Weise benannt
argc
undargv
dargestellt.argv
ist ein Zeiger auf ein Array von C-Zeichenfolgen, die die Argumente für das Programm darstellen.argc
ist die Anzahl der Argumente imargv
Array.argv[0]
Enthält normalerweise den Namen des Programms, dies ist jedoch nicht immer der Fall.argv[argc]
ist garantiert ein Nullzeiger.Beachten Sie, dass, da ein Array-Typ-Argument (wie
char*[]
) eigentlich nur ein getarntes Zeigertyp-Argument ist, die folgenden beiden gültige Schreibweisen (2) sind und beide genau dasselbe bedeuten:Einige Implementierungen erlauben möglicherweise andere Arten und Anzahlen von Parametern. Sie müssen die Dokumentation Ihrer Implementierung überprüfen, um festzustellen, was sie unterstützt.
main()
Es wird erwartet, dass Null zurückgegeben wird, um Erfolg anzuzeigen, und Nicht-Null, um Fehler anzuzeigen. Sie müssen einereturn
Anweisung nicht explizit schreiben inmain()
: Wenn Siemain()
ohne explizitereturn
Anweisung zurückkehren lassen, ist dies dasselbe, als hätten Sie geschriebenreturn 0;
. Die folgenden zweimain()
Funktionen verhalten sich gleich:Es gibt zwei Makros,
EXIT_SUCCESS
undEXIT_FAILURE
definiert in<cstdlib>
das kann auch von zurückgegeben werdenmain()
Erfolg und Misserfolg , um anzuzeigen, respectively.Der von zurückgegebene Wert
main()
wird an dieexit()
Funktion übergeben, die das Programm beendet.Beachten Sie, dass all dies nur beim Kompilieren für eine gehostete Umgebung gilt (informell eine Umgebung, in der Sie über eine vollständige Standardbibliothek verfügen und auf einem Betriebssystem Ihr Programm ausgeführt wird). Es ist auch möglich, ein C ++ - Programm für eine freistehende Umgebung (z. B. einige Arten eingebetteter Systeme) zu kompilieren. In diesem Fall sind Start und Beendigung vollständig implementierungsdefiniert und eine
main()
Funktion ist möglicherweise nicht einmal erforderlich. Wenn Sie jedoch C ++ für ein modernes Desktop-Betriebssystem schreiben, kompilieren Sie für eine gehostete Umgebung.quelle
Main
eine statische Elementfunktion sein, da es nicht einmal Nichtmitgliedsfunktionen enthält. Sogar C89 mussmain
zurückkehrenint
. Ich bin mit K & R C nicht ausreichend vertraut, um die genauen Regeln zu kennen, aber ich würde vermuten, dass es auch einemain
Rückgabe erfordert ,int
damain
ohne Rückgabetyp etwas üblich war und kein Typ =int
in K & R impliziert .int
.void
Rückgabetyp als Spracherweiterung . Zu den Compilern, die dies nicht zulassen, gehören GCC und Comeau.Aus Standarddokumenten., 3.6.1.2 Hauptfunktion ,
int main() { / ... / }
undint main(int argc, char* argv[]) { / ... / }
Hoffentlich hilft das..
quelle
main
sein sollteint
?void
bricht dieses Modell. Es macht nicht einmal wirklich Sinn, wenn Sie es als "immer für Erfolg halten" bezeichnen würden. Weil Sie nicht sagen konnten, ob der Prozess tatsächlich fehlgeschlagen ist, haben Sie es wirklich geschafft? Nein, komm zurückint
.Der genaue Wortlaut des neuesten veröffentlichten Standards (C ++ 14) lautet:
Dies macht deutlich, dass alternative Schreibweisen zulässig sind, solange der Typ
main
der Typ istint()
oderint(int, char**)
. Daher sind auch folgende 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)
quelle
int main(void)
in C ++ nicht korrekt war.auto main() -> int
hat keinen abgeleiteten Rückgabetyp. Achten Sie auf das {in "(auto main () {... ist nicht erlaubt)" und lernen Sie bitte, wenn Sie noch nicht genug wissen, um etwas Sinnvolles hinzuzufügen.Die beiden gültigen Netze sind
int main()
undint main(int, char*[])
. Alles andere kann kompiliert werden oder nicht. Wennmain
ein Wert nicht explizit zurückgegeben wird, wird implizit 0 zurückgegeben.quelle
main
als ungültig erwähne . Gibt es einen bestimmten Grund, warum der Rückgabetyp von main int sein sollte?int
Rückgabetyp erfordert,main
ist, dass dieser Wert als Exit-Code des Programms an die Shell übergeben wird und einensh
erwartetint
.void
, sind alle still. Mit müssenint
wir den spezifischen Exit-Wert für jede Rückgabe von definierenmain
.Details zu Rückgabewerten und deren Bedeutung
Per 3.6.1 (
[basic.start.main]
):Das Verhalten von
std::exit
wird in Abschnitt 18.5 ([support.start.term]
) beschrieben und beschreibt den Statuscode:quelle