Unterschied zwischen main(void) und main() in C [duplicate]

Lesezeit: 5 Minuten

Benutzer-Avatar
Architekt

Kann mir jemand den Unterschied zwischen sagen int main() und int main(void)? Warum funktionieren beide und was ist das Standardargument dafür? int main()?

Benutzer-Avatar
bmargulies

Unter normalen Umständen kein Unterschied. Dies ist kein ‘Standardargument für main()’, da es überhaupt keine Argumente hat.

Hier ist der ungewöhnliche Umstand. Wenn Sie Ihren eigenen Aufruf an main schreiben, dann () ermöglicht es Ihnen, ihm beliebige Parameter zu übergeben, während (void) wird Sie zwingen, es zu passieren, keiner. Nichts davon ist jedoch im Hinblick auf den 99,99999999%-Fall von Bedeutung, der hauptsächlich von der Laufzeitumgebung aufgerufen wird, um Ihr Programm zu starten. Die Laufzeitumgebung weiß es nicht und kümmert sich nicht darum, ob Sie schreiben () oder (void).

Wenn Sie den Standard codieren int main(int argc, char **argv) Dort erhalten Sie Ihre Befehlszeilenparameter.

  • +1 — in C++ gibt es keinen Unterschied, aber es gibt einen kleinen Unterschied in C. Es ist jedoch geringfügig.

    – Billy ONeal

    14. September 2010 um 16:55 Uhr

  • "No difference"lies Billys Beitrag.

    – Prasun Saurav

    14. September 2010 um 16:55 Uhr

  • @Billy: Diese Frage wurde mit C und nicht mit C++ gekennzeichnet.

    – Prasun Saurav

    14. September 2010 um 16:56 Uhr


  • @Prasoon: Ja, ich weiß. Ich fand immer noch, dass diese Antwort in C++ richtig ist, um von Vorteil zu sein. Nur weil es technisch gesehen einen Unterschied in C gibt, heißt das nicht, dass es sich um einen allgemein verwendeten oder wichtigen Unterschied handelt. Daher denke ich, dass dies eine gute Antwort ist und eine positive Bewertung verdient.

    – Billy ONeal

    14. September 2010 um 16:58 Uhr

  • @Billy ONeal: Diese Antwort ist technisch nicht 100% korrekt (wie Sie sagten), wenn Sie C (Tag) berücksichtigen. Aber trotzdem würde ich diese Antwort nicht positiv bewerten. Übrigens hat mir Ihre Antwort gefallen und ich habe sie positiv bewertet.

    – Prasun Saurav

    14. September 2010 um 17:02 Uhr

Benutzer-Avatar
Vanza

main() ermöglicht es Ihnen, main mit einer beliebigen Anzahl von Parametern aufzurufen. main(void) zwingt Sie, main ohne Parameter aufzurufen. So:

main(foo, bar);

Geht gut mit main() aber nicht mit main(void) – Der Compiler generiert einen Fehler.

Wenn Sie jetzt speziell nach dem Einstiegspunkt des Programms fragen, macht das keinen wirklichen Unterschied; In beiden Fällen stehen Ihnen die Argumente für das Programm (argc, argv, envp) nicht zur Verfügung.

  • +1 – beachten Sie das envp ist eine nicht standardmäßige Erweiterung.

    – Billy ONeal

    14. September 2010 um 16:53 Uhr

  • @Billy ONeal: Aber vom Standard in §5.1.2.2.1.1 erlaubt.

    – Matt Tischler

    14. September 2010 um 23:40 Uhr


  • @Matt: Ich habe nie gesagt, dass es nicht erlaubt ist. Ich sagte nur, dass es nicht im Standard ist.

    – Billy ONeal

    15. September 2010 um 0:16 Uhr

Benutzer-Avatar
Jerry Sarg

Aus praktischer Sicht gibt es keinen wirklichen Unterschied. Mit int main(void)das sagst du ausdrücklich main nimmt keine Parameter entgegen, also können Sie es nicht mit irgendwelchen aufrufen. Mit int main()lassen Sie die Möglichkeit des Aufrufs offen main mit einigen Parametern.

Außer in seltsamen Situationen wie Code-Golf oder absichtlich verschleiertem Code rufen Sie jedoch nicht auf main wie auch immer – es ist der Einstiegspunkt zum Programm, also wird es automatisch vom Startcode aufgerufen. Der Startcode übergibt die Befehlszeilenargumente sowieso, sodass Ihre Auswahl nicht ändert, wie er aufgerufen wird, sondern nur, ob Sie die übergebenen Parameter verwenden oder ignorieren.

Der Standard erlaubt Ihnen ausdrücklich zu definieren main mit oder ohne Parameter (§5.1.2.2.1/1):

Die beim Programmstart aufgerufene Funktion heißt main. Die Implementierung deklariert keinen Prototyp für diese Funktion. Es muss mit einem Rückgabetyp von int und ohne Parameter definiert werden:

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

oder mit zwei Parametern (hier als argc und argv bezeichnet, obwohl beliebige Namen verwendet werden können, da sie lokal für die Funktion sind, in der sie deklariert sind):

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

oder gleichwertig;

Obwohl es außerhalb der angegebenen Tags liegt, ist die Situation in C++ etwas anders. In C eine Funktionsdeklaration wie:

int f();

gibt das an f ist eine Funktion, die ein zurückgibt intaber gibt nein Informationen über die Anzahl oder Art der Parameter f erwarten (dies ist hauptsächlich aus Gründen der Kompatibilität mit altem Code enthalten – früher war dies die nur Möglichkeit, eine Funktion in C zu deklarieren). In C++ wird dieselbe Deklaration explizit deklariert f als eine Funktion, die keine Parameter akzeptiert, also versucht, sie aufzurufen f mit einem oder mehreren Parametern kann diese Funktion nicht aufrufen (sie muss entweder eine andere Überladung aufrufen oder einen Fehler erzeugen, wenn keine geeignete Überladung gefunden wird).

  • @Jens: Nein, darauf bin ich einfach nicht eingegangen, weil es für die vorliegende Frage nicht relevant war. Ja, es könnte andere Möglichkeiten geben, main aufzurufen, aber zumindest diese beiden sind definitiv erlaubt. Ja, es könnte möglicherweise ein anderer Typ zurückgegeben werden, aber das OP scheint sich nur mit Parametern zu befassen, nicht mit dem Rückgabetyp.

    – Jerry Sarg

    14. September 2010 um 18:37 Uhr

  • Tut mir leid, wenn Sie sich beleidigt gefühlt haben. Aus diesem Satz folgt jedoch, dass eine Implementierung die Version vielleicht sogar erlaubt int main() mit beliebig vielen Parametern.

    – Jens Gustedt

    14. September 2010 um 19:52 Uhr

  • @JerryCoffin, kurze Frage. Wie würden Sie eine Überladung aufrufen, wenn die Funktion f( ) ist? Ich habe mir dieses locklessinc(dot)com/articles/overloading/-Beispiel angesehen, aber anscheinend benötigen Sie dafür einen Parameter. Vielen Dank

    – BluePython

    13. September 2015 um 16:42 Uhr


  • @BluePython: Ich bin mir nicht sicher, ob ich dem folge, was Sie fragen.

    – Jerry Sarg

    13. September 2015 um 20:54 Uhr

1373280cookie-checkUnterschied zwischen main(void) und main() in C [duplicate]

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

Privacy policy