wieso kein void main () ?



  • Warum ist eigentlich

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

    der Standard und nicht

    void main ()
    {
    ...
    }
    

    ???? 😕



  • Weil jedes Programm einen Rückgabewert haben muss, den das Betriebssystem (zumindest jedes mir geläufige, das auf x86 verwendet wird) an das aufrufende Programm am Ende zurückgibt. Bei void weiß das OS nicht was es machen soll und daher fordert man int.



  • Weil ein Programm einen Wert an das Betriebssystem zurückgibt.



  • Weil's Standard ist?!?



  • weils in der FAQ steht 😃



  • @Phoenix

    Aber mit

    void main ()
    {
    ...
    }
    

    klappts doch auch.
    Was heißt das OS weiß nicht was es machen soll ?
    Bei void wird doch gar kein Rückgabewert erwartet. 😕



  • Manche Compiler liefern als Rückgabewert immer 0, wenn man 'void main()' verwendet.



  • Andere erzeugen Programme, die ständig Core-Dumps setzten. BTW:

    /* hier nix */
    int main;
    /* hier nix */
    

    wird hier übrigens auch übersetzt.



  • Überleg dir mal du schrteibst ein Programm mit einer inetrnen Funktion vom Typ void.
    du rufst diese Funktion auf und sie soll etwas verändern, was aber nicht unbedingt klappen muss. von Main kannst du den erfolg nicht prüfen, weil es villeicht zu umständlich ist. Also MUSS die Funktion main informieren ob die operation geglückt ist, denn falls nicht könnte das Programm villeicht abstürzen.
    genauso ist es beim OS<->Programm. Dein Programm verändert irgendetwas, was kritisch für das gesamte system ist, klappt dies nicht, so muss es repariert werden, weil sonnst das OS crashed. hat das Programm keinen return wert, so weis sdas oS nicht ob etwas schief gelaufen ist oder alles ok ist. fall 1 wäre fatal, bei fall 2 läuft alles korrekt weiter, aber das verhalten ist undefiniert.

    PS: hoffe das war einigermaßen nachvolziehbar ^^

    [ Dieser Beitrag wurde am 06.07.2003 um 16:02 Uhr von THE_FreaK editiert. ]



  • Original erstellt von <Hendrik>:
    **@Phoenix

    Aber mit

    void main ()
    {
    ...
    }
    

    klappts doch auch.
    Was heißt das OS weiß nicht was es machen soll ?
    Bei void wird doch gar kein Rückgabewert erwartet. 😕**

    Ja, aber dem Aufrufer ist egal, wie das Programm erstellt wurde, es will vom OS im zweifelsfall einen Rückgabewert haben. Und das OS kann dann entweder sowas wie 0 zurückgeben oder einfach das nehmen, was gerade im Rückgaberegister rumliegt, meistens Salat. Beides ist hässliches Verhalten, beim ersten denkt der Aufrufer, dass das Programm ordnungsgemäß durchgelaufen ist, was aber nicht so sien muss, beim zweiten weiß der Aufrufer nicht, ob es nun korrekt durchgelaufen ist oder nicht. Deswegen schreibt der Standard vor, int als Typ von main zu nehmen, dmait solcher mist nicht passiert.



  • Aber liefert denn

    int main ()
    {
    ...
    }
    

    nicht 0 als default zurück wenn ich

    return 0;
    

    gar nicht selbst ins Programm schreibe ?
    Oder liefert es automatisch nicht 0 wenn was schief gelaufen ist ?
    Und 😞 was ist OS 😕

    Danke für die vielen Antworten !



  • Wenn Du nichts reinschreibst wird automatisch 0 zurückgegeben.
    Im Fehlerfall solltest Du aber was anderes zurückgeben, z.B. 1
    Mit OS ist das Betriebssystem gemeint (englisch von Operating System).



  • $ cat test.c
    int main() {}
    $ gcc -std=c99 -W -Wall -pedantic test.c && ./a.out
    $ echo $?
    0
    

    Also der gcc kompiliert es selbst im Standard-Modus, und liefert in dem Fall den Wert 0 zurueck. Scheint also standardkomform zu sein (muesste ich zuhause nachlesen)



  • Steh definitiv im Standard drin. Kann die Nummer halt nicht auswenig, aber hab's schon gelesen.



  • IMHO gibt es keinen wirklichen Grund, void main zu verbieten. Es gibt genug Compiler, die das sinnvoll übersetzen, es gibt haufenweise Programme, die keinen sinnvollen Exit-Status haben, bei int main wird, wenn nichts anderes gesagt ist, automatisch 0 zurückgegeben. Es würde nichts kaputtmachen, wenn man void main zulassen würde.

    (solang es nicht erlaubt ist schreibt man natürlich brav int main)



  • ist aber kein C Standard! Sondern C++!

    dort steht es in 3.6.1

    If control reaches the end of main without encountering a return statement, the effect is that of executing return 0;



  • Ist doch C-Standard. 5.1.2.2.3: «reaching the } that terminates the main function returns a value of 0.»



  • Original erstellt von Bashar:
    **IMHO gibt es keinen wirklichen Grund, void main zu verbieten. Es gibt genug Compiler, die das sinnvoll übersetzen, es gibt haufenweise Programme, die keinen sinnvollen Exit-Status haben, bei int main wird, wenn nichts anderes gesagt ist, automatisch 0 zurückgegeben. Es würde nichts kaputtmachen, wenn man void main zulassen würde.

    (solang es nicht erlaubt ist schreibt man natürlich brav int main)**

    Dass es viele Porgramme gibt, die diese schlechte Angewohnheit haben und Compiler die auch noch drüber wegsehen, heißt ja noch lange nicht, dass man es fördern muss. Ich shcätze spätestens, wenn man so ein "kaputtes" Programm z.B. in einem Makefile benutzt, bekommt man hässliche Ergebnisse. (Und wer weiß schon ob sowas dann doch mal passiert...)

    [ Dieser Beitrag wurde am 07.07.2003 um 13:23 Uhr von TriPhoenix editiert. ]



  • Wieso kaputt? Man müßte natürlich definieren, dass ein Programm mit void main in einem hosted environment eine 0 an selbiges zurückgibt.



  • In einem "hosted environment" ist eh _nichts_ für die Startfunktion vorgeschrieben - da kann man auch DWORD WINAPI WinMain(blah...) schreiben.


Anmelden zum Antworten