Warum ist void main() so beliebt?

Lesezeit: 4 Minuten

Benutzer-Avatar
Benutzer4694281

In C89/C99/C11 ist in einer freistehenden Umgebung die Einstiegspunktfunktion implementierungsdefiniert. In einer gehosteten Umgebung muss dies der Fall sein int main in einem streng konformen Programm. Die meisten modernen Compiler machen void main ein Fehler. Allerdings sehe ich viele Benutzer mit void main. Selbst wenn es in einem nicht konformen Compiler erlaubt ist, warum sollte man es verwenden? Ich sehe keinen praktischen Grund dafür void main am liebsten wäre int main. Selbst in C89 ist es ein undefiniertes Verhalten, das wegzulassen return.

Gibt es einen historischen Grund für die Popularität von void main?

Ich glaube nicht, dass meine Frage primär meinungsbasiert ist. In diesem Thread wurden bereits einige gültige Ideen vorgestellt, wie z. B. die von Microsoft void main Erweiterung und seit der Popularität von Windows, sowie das Ergebnis von C-Büchern, die falsche Informationen nachdrucken. Das sind sachliche und historische Gründe.

  • Vielleicht, weil es vielen Leuten egal ist, einen Fehler/Erfolg an das Betriebssystem zurückzugeben.

    – m0skit0

    20. März 2015 um 14:04 Uhr


  • Könnte etwas damit zu tun haben, 42 zurückgeben zu wollen, aber niemand hat eine Ahnung, was das bedeuten soll.

    – Hans Passant

    20. März 2015 um 14:04 Uhr

  • Die Leute wissen nicht immer, was sie tun.

    – Juanchopanza

    20. März 2015 um 14:10 Uhr

  • Siehe: Was sollte main() Returnin C und C++? für eine umfassende Behandlung des Themas. IMO, es ist beliebt, weil (a) es Ihnen ermöglicht, das Schreiben einer Codezeile zu vermeiden, und (b) Microsoft sagt, dass es auf Windows-Computern in Ordnung ist. Es bedeutet auch, dass Sie sich nicht um den Exit-Status Ihres Programms kümmern – Sie schreiben keinen Code in einer Skriptumgebung, in der der Exit-Status wichtig ist.

    – Jonathan Leffler

    20. März 2015 um 14:15 Uhr


  • Äh, Herb Schildt… lysator.liu.se/c/schildt.html

    – joop

    20. März 2015 um 14:18 Uhr

Benutzer-Avatar
Vlad aus Moskau

Gibt es einen historischen Grund für die Popularität von void main?

Der historische Grund liegt meiner Meinung nach darin, dass Bücher über Programmierung in C (insbesondere populärere) geschrieben wurden, bevor der Standard verabschiedet wurde, und veröffentlicht wurden, nachdem (oder sogar bevor) der Standard verabschiedet wurde. So viele Bücher über die Programmierung in C enthielten die Deklaration von main mit dem Rückgabetyp void. Manchmal wurden diese Bücher neu veröffentlicht, ohne ihren Inhalt zu überarbeiten. Und aufgrund der Tatsache, dass alte Compiler normalerweise die Deklaration von main mit void unterstützten, waren solche Deklarationen beliebt.

Vielleicht haben auch einige Compiler-Hersteller (vielleicht sogar Microsoft. Wie Sie wissen, erlaubt C# die Deklaration von Main mit void. Zumindest Borland C++ erlaubte die Verwendung von void main) haben ihre eigenen implementierungsdefinierten Deklarationen von main eingeführt. und main mit void war eine beliebte implementierungsdefinierte Deklaration. Bücher über die Programmierung in C beziehen sich daher normalerweise auf diese beliebten Compiler mit ihrer implementierungsdefinierten Hauptdeklaration.

  • void main() war vor der ersten C-Norm eigentlich keine Option, weil void war vor dem ersten C-Standard nicht wirklich Teil von C. Was halbwegs erlaubt war, war gerecht main() – kein expliziter Rückgabetyp – aber Sie sollten trotzdem einen Wert von solchen Funktionen zurückgeben, wenn der Wert verwendet wurde. Die Leute haben den Code nicht gesehen, der den Rückgabewert von verwendet hat main()obwohl die Muscheln es erwischt haben.

    – Jonathan Leffler

    20. März 2015 um 14:18 Uhr


  • IIRC (aber mein Gedächtnis könnte falsch sein, ich werde alt) ein alter TurboC-Compiler unter MSDOS akzeptiert (oder vielleicht bevorzugt) void main() das war Anfang der 1980er Jahre

    – Basile Starynkevitch

    20. März 2015 um 14:19 Uhr


  • +1 zu dieser Antwort, da Sie die Grundidee richtig verstanden haben, aber ich denke, die meisten dieser Bücher wurden nach der Standardisierung geschrieben. Das Problem ist nur, dass ihre Autoren inkompetent waren, aber es geschafft haben, Bücher herauszubringen, die viele Leute lesen. Meiner Meinung nach ist die meiste Verantwortung für den Missbrauch der C-Sprache und die Missverständnisse der Menschen (im Allgemeinen negative Ansichten) über C auf schlechten Unterricht in Form von schlechten Büchern und schlechten Lehrern zurückzuführen.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    20. März 2015 um 15:10 Uhr

  • Ich vermute, dass Turbo C hier bei weitem der größte Schuldige ist, es war damals der vollständig Compiler-dominante und erlaubte void main(). Selbst heute noch verwirren wir Schüler mit beschissenen Lehrern, die Fragen mit dieser Form von main auf SO posten. (Hauptsächlich, weil das rückständige Bildungssystem in einem bestimmten Land, das ich nicht nennen werde, auf nationaler Ebene entschieden zu haben scheint, dass Turbo C immer noch das Sahnehäubchen und DOS das Betriebssystem der Zukunft ist.)

    – Ludin

    20. März 2015 um 15:20 Uhr

  • “Das Sahnehäubchen” <3

    – MM

    28. März 2015 um 4:38 Uhr

Benutzer-Avatar
Shauryachats

Lundins Antwort zitieren,

Wenn Ihr Programm in a Hostlose Umgebung (Ihr Programm ist ein eingebettetes System oder ein Betriebssystem), kann es einen beliebigen Rückgabetyp haben. void main() ist am häufigsten.

Wenn Ihr Programm in a gehostete Umgebung (auf einem Betriebssystem)main() muss int zurückgeben und kann zusätzliche Parameter haben.

BEARBEITEN:

Da das OP nach einer gehosteten Umgebung fragt, kann ich Keiths Antwort zitieren:

In ähnlicher Weise hat C void main() nur als Erweiterung zugelassen; derselbe Standard von 1989, der das Schlüsselwort void einführte, definierte die beiden Standarddefinitionen für main: int main(void) und int main(int argc, char *argv[]).

und Pochis Antwort,

Sie möchten im Allgemeinen den Exit-Status Ihres Programms wissen. Das ist der Grund, warum Sie int main() haben – Sie geben Ihren Exit-Status zurück.

Aus diesen beiden überzeugenden Antworten kann ich meiner bescheidenen Meinung nach schließen:

Zur Zeit von C89 / C99 / C11 hätte C möglicherweise nicht zugelassen void main aber für Kleine Programme, die von Enthusiasten, Lernenden und Anfängern erstellt wurden, machen sich daher in diesem Stadium möglicherweise keine Gedanken über die Rückgabewerte void main wurde bekannt.

  • Ich sehe nicht, wie dies die Frage beantwortet.

    – Juanchopanza

    20. März 2015 um 14:10 Uhr

  • @juanchopanza Das OP fragt Ich sehe keinen praktischen Grund, warum void main int main vorgezogen werden sollte. Das ist der Grund.

    – Shauryachats

    20. März 2015 um 14:11 Uhr


  • @volerag Ich habe den freistehenden Teil bereits in meiner Frage erwähnt. Ich habe nach einer gehosteten Umgebung gefragt.

    – Benutzer4694281

    20. März 2015 um 14:12 Uhr

  • Als Person, die diese Antwort irgendwann geschrieben hat, bin ich mir heute etwas weniger sicher – der Standard könnte tatsächlich als “jeder von der Implementierung definierte Weg geht” interpretiert werden, selbst für gehostete Umgebungen. Aber dann müssen Sie die Bedeutung von implementierungsdefiniert erkennen, es bedeutet “es ist in Ordnung für den Compiler, in diesem Fall zu tun, was er will solange es dokumentiert, wie“. Wenn für eine bestimmte Nicht-Standardform von main keine solche Compiler-Dokumentation existiert, sollte dies als undefiniertes Verhalten behandelt werden.

    – Ludin

    20. März 2015 um 15:15 Uhr


  • In einem freistehend Umgebung, Sie sollten keine Funktion aufrufen main an erster Stelle. Das main Die Funktion ist durch den Standard genau definiert, und die Verwendung von a anders Art der main ist nur verwirrend. Nennen kmain oder kernel_main oder etwas Ähnliches, und niemand wird Sie schief ansehen, weil Sie seinen Rückgabetyp machen void.

    – DevSolar

    20. März 2015 um 15:21 Uhr


Wenn Sie *NIX oder MAC verwenden, gehen Sie wie folgt vor

  1. Kopieren Sie den folgenden Code nach test1.c

    void main() {
    }
    
  2. Kompilieren Sie den Code in der Befehlszeile

    cc test1.c
    
    gcc test.c
    
  3. Folgend ausführen

    ./a.out
    
  4. Führen Sie Folgendes aus (dies zeigt Ihnen, was von Ihrem Programm zurückgegeben wird

    echo $?
    
  5. Speichern Sie diesen Code in test2.c

    void main() {
        int i = 5;
    }
    
  6. Wiederholen Sie 2, 3 und 4 für test2.c

Deshalb wird es nicht empfohlen.

Warum war es beliebt? Ich kenne keine anderen Antworten als die oben genannten. Ich habe jedoch eine Frage; war K&R 1st Edition mit void main() oder int main()?

  • K&R 1. Aufl. hätte unmöglich verwendet werden können void main seit void wurde zu dieser Zeit noch nicht einmal erfunden (es wurde erst mit der Geburt von C++). K&R 1. Aufl. implizit verwenden int An vielen Orten.

    – Jens

    21. März 2015 um 7:33 Uhr

  • Danke @Jens für die Antwort

    Benutzer4580220

    21. März 2015 um 23:41 Uhr

1048850cookie-checkWarum ist void main() so beliebt?

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

Privacy policy