Was ist die richtige Deklaration von main in C++?

Lesezeit: 7 Minuten

Was ist die richtige Deklaration von main in C
fredoverflow

Fragen

  • Was ist die richtige Signatur der main Funktion in C++?

  • Was ist der richtige Rückgabetyp und was bedeutet es, einen Wert 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 dagegen verstoße?

  • Dies ist sehr eng verwandt mit oder ein Duplikat von What should main Rückkehr in C und C++.

    – Jonathan Leffler

    17. Mai 2014 um 20:02 Uhr

  • @JonathanLeffler Kein Scherz … es wurde vor etwa 8 Monaten in die Liste der Duplikate in Revision 6 aufgenommen.

    – fredoverflow

    18. Mai 2014 um 10:18 Uhr

Was ist die richtige Deklaration von main in C
James McNellis

Die main Die Funktion muss im globalen Namespace als Nicht-Member-Funktion deklariert werden. Dies bedeutet, dass es sich nicht um eine statische oder nicht statische Elementfunktion einer Klasse handeln kann und auch nicht in einem Namensraum (auch nicht im unbenannten Namensraum) platziert werden kann.

Der Name main ist in C++ nicht reserviert, außer als Funktion im globalen Namensraum. Es steht Ihnen frei, andere benannte Entitäten zu deklarieren maindarunter unter anderem Klassen, Variablen, Enumerationen, Member-Funktionen und Nicht-Member-Funktionen, die sich nicht im globalen Namensraum befinden.

Sie können eine Funktion mit dem Namen deklarieren main als Mitgliedsfunktion oder in einem Namensraum, aber eine solche Funktion wäre das nicht main Funktion, die angibt, wo das Programm beginnt.

Die main Funktion kann nicht als deklariert werden static oder inline. Es kann auch nicht überladen werden; es kann nur eine benannte Funktion geben main im globalen Namensraum.

Die main Funktion kann in Ihrem Programm nicht verwendet werden: Sie dürfen die nicht aufrufen main Funktion von irgendwo in Ihrem Code, noch dürfen Sie seine Adresse nehmen.

Der Rückgabetyp von main muss sein int. Es ist kein anderer Rückgabetyp zulässig (diese Regel ist fett gedruckt, da es sehr häufig vorkommt, dass falsche Programme deklarieren main mit einem Rückgabetyp von void; Dies ist wahrscheinlich die am häufigsten verletzte Regel in Bezug auf die main Funktion).

Es gibt zwei Deklarationen von main das muss erlaubt sein:

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

Im (1)es gibt keine Parameter.

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

Meistens, argv[0] enthält den Namen des Programms, aber das ist nicht immer der Fall. argv[argc] ist garantiert ein Nullzeiger.

Beachten Sie, dass da ein Array-Typ-Argument (wie char*[]) eigentlich nur ein getarntes Zeigerargument ist, sind die beiden folgenden Schreibweisen gültig (2) und beide bedeuten genau dasselbe:

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

Einige Implementierungen können andere Typen und Anzahlen von Parametern zulassen; Sie müssten die Dokumentation Ihrer Implementierung überprüfen, um zu sehen, was sie unterstützt.

main() wird erwartet, dass es Null zurückgibt, um Erfolg anzuzeigen, und Nicht-Null, um einen Fehler anzuzeigen. Sie müssen nicht ausdrücklich a schreiben return Aussage ein main(): wenn Sie lassen main() Rückkehr ohne eine ausdrückliche return Aussage, es ist dasselbe, als ob Sie geschrieben hätten return 0;. Die folgenden zwei main() Funktionen haben das gleiche Verhalten:

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

Es gibt zwei Makros, EXIT_SUCCESS und EXIT_FAILUREdefiniert in <cstdlib> die auch zurückgegeben werden können main() Erfolg bzw. Misserfolg anzuzeigen.

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

Beachten Sie, dass all dies nur gilt, wenn Sie für eine gehostete Umgebung kompilieren (informell eine Umgebung, in der Sie über eine vollständige Standardbibliothek verfügen und ein Betriebssystem Ihr Programm ausführt). Es ist auch möglich, ein C++-Programm für eine freistehende Umgebung zu kompilieren (z. B. einige Arten von eingebetteten Systemen), in diesem Fall sind Start und Beendigung vollständig implementierungsdefiniert und a main() Funktion möglicherweise nicht einmal erforderlich. Wenn Sie C++ jedoch für ein modernes Desktop-Betriebssystem schreiben, kompilieren Sie für eine gehostete Umgebung.

  • IIRC die einzigen garantierten Rückgabewerte sind 0, EXIT_SUCCESS (gleiche Wirkung wie 0) und EXIT_FAILURE. BEARBEITEN: Ah, OK, andere Statuswerte ungleich Null können zurückgegeben werden, aber mit implementierungsdefinierter Bedeutung. Nur EXIT_FAILURE wird garantiert in irgendeiner Weise als Fehlerwert interpretiert.

    – Derrick Turk

    17. November 2010 um 17:24 Uhr


  • @Synetech: Die Frage lautet im ersten Satz: “Was ist die richtige Signatur der Hauptfunktion in C++?” und die Frage ist mit beiden markiert [c++] und [c++-faq]. Ich kann nichts dafür, wenn Java- oder C#-Benutzer (oder sonst jemand) immer noch verwirrt sind. C# erfordert Main eine statische Mitgliedsfunktion sein, weil sie nicht einmal Nichtmitgliedsfunktionen hat. Auch C89 erfordert main zurückgeben int. Ich bin mit K&R C nicht ausreichend vertraut, um seine genauen Regeln zu kennen, aber ich würde vermuten, dass es auch erforderlich ist main zurückgeben int seit main ohne Rückgabetyp war etwas üblich und kein Typ = implizit int bei K&R.

    – James McNellis

    21. Dezember 2010 um 20:30 Uhr

  • @Suhail: Weil der Sprachstandard besagt, dass der Rückgabetyp sein soll int.

    – James McNellis

    15. Juni 2011 um 16:35 Uhr

  • @Suhail: Ja. Ihr Code wird nicht korrekt C++ sein und viele Compiler werden Ihren Code ablehnen.

    – James McNellis

    15. Juni 2011 um 18:37 Uhr

  • @Suhail: Visual C++ erlaubt a void Rückgabetyp als Spracherweiterung. Zu den Compilern, die dies nicht zulassen, gehören GCC und Comeau.

    – James McNellis

    15. Juni 2011 um 21:08 Uhr

Aus Standarddokumenten, 3.6.1.2 Hauptfunktion,

Es muss einen Rückgabetyp vom Typ int haben, aber ansonsten ist sein Typ implementierungsdefiniert. Alle Implementierungen müssen die beiden folgenden Definitionen von main zulassen:

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

In letzterer Form argc soll die sein Anzahl der an das Programm übergebenen Argumente aus der Umgebung, in der das Programm ausgeführt wird. Wenn argc ungleich Null ist diese Argumente sind in argv anzugeben[0] durch argv[argc-1] als Zeiger auf die Anfangszeichen von nullterminierten Multibyte-Strings…..

Ich hoffe, das hilft..

  • Gibt es einen bestimmten Grund, warum der Rückgabetyp von main sollte sein int ?

    – Suhail Gupta

    15. Juni 2011 um 12:01 Uhr

  • @SuhailGupta: Damit der aufrufende Prozess weiß, ob Das Prozess als erfolgreich gewertet werden soll oder nicht. Zulassen void bricht dieses Modell. Es macht nicht einmal wirklich Sinn, wenn es “immer als Erfolg betrachten” bedeuten würde. Denn Sie hatten keine Möglichkeit zu sagen, ob der Prozess tatsächlich fehlgeschlagen ist, und Sie auch Ja wirklich erfolgreich? Keine Rückkehr int.

    – Leichtigkeitsrennen im Orbit

    2. Januar 2017 um 13:55 Uhr

Der genaue Wortlaut des neusten veröffentlichten Standards (C++14) lautet:

Eine Implementierung soll beides zulassen

  • eine Funktion von () Rückkehr int und

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

als Art von main.

Damit ist klargestellt, dass alternative Schreibweisen zulässig sind, solange die Art von main ist der Typ int() oder int(int, char**). Also erlaubt sind auch:

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

  • NB. Ich habe diese Antwort als Kommentar zu einem anderen Thread gepostet, jemand hat versucht, diesen Thread als Beweis dafür zu zitieren int main(void) war in C++ nicht korrekt.

    – MM

    1. Juli 2017 um 9:22 Uhr

  • @Stargateur auto main() -> int hat keinen abgeleiteten Rückgabetyp. Achten Sie auf das { in “(auto main() {… ist nicht erlaubt)” und informieren Sie sich bitte, wenn Sie noch nicht genug wissen, um etwas Sinnvolles hinzuzufügen.

    Benutzer743382

    1. Juli 2017 um 9:44 Uhr


1647201010 239 Was ist die richtige Deklaration von main in C
Steinmetall

Die beiden gültigen Hauptleitungen sind int main() und int main(int, char*[]). Alles andere kann kompilieren oder auch nicht. Wenn main gibt keinen expliziten Wert zurück, 0 wird implizit zurückgegeben.

1647201010 317 Was ist die richtige Deklaration von main in C
Ben Voigt

Details zu Rückgabewerten und deren Bedeutung

Gemäß 3.6.1 ([basic.start.main]):

Eine Rückgabeerklärung in main hat die Wirkung, die zu verlassen main Funktion (Zerstören beliebiger Objekte mit automatischer Speicherdauer) und aufrufen std::exit mit dem Rückgabewert als Argument. Wenn die Kontrolle das Ende erreicht main ohne auf a zu stoßen return Anweisung ist die Wirkung die der Ausführung

return 0;

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

Schließlich wird die Steuerung an die Hostumgebung zurückgegeben. Wenn der Status Null ist oder EXIT_SUCCESS, wird eine implementierungsdefinierte Form des Status erfolgreiche Beendigung zurückgegeben. Wenn Status ist EXIT_FAILURE, wird eine implementierungsdefinierte Form des Status erfolglose Beendigung zurückgegeben. Andernfalls ist der zurückgegebene Status implementierungsdefiniert.

998850cookie-checkWas ist die richtige Deklaration von main in C++?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy