Korrektes C++ Programm?



  • Und da du Linux erwähntest nehme ich an du benutzt g++. Der hält sich an den Standard. Wie du schon richtig erkannt hast ist dein Program nicht standardconform.

    int main()
    

    Sofern du keine Parameter an main übergibst.



  • soweit ich weiss

    int main

    dann halt unten return 0;

    dann meckert er bestimmt nicht mehr



  • Die Frage meinst du doch nicht ernst?
    Wenn du wüsstest was der Standard ist, wüsstest du wie man main zu deklarieren hat.



  • mein Microsoft Compiler hat mich jahrelang betrogen 😮



  • Der Standard definiert folgende Formen von main, die jeder Compiler erfüllen muss:

    int main();
    // und
    int main(int argc, char *argv[]);
    

    Alles andere sind non-standard-Erweiterungen. In C++ musst du allerdings nicht explizit einen Wert zurück geben, per default returnt main 0 (anders als in C), was einen erfolgreichen Ablauf signalisiert. Es ist allerdings guter Stil, im Falle eines fehlerhaften Verlaufs einen Fehlercode an die Shell zurückzugeben.

    Ansonsten entnehme ich der Meldung, dass du einen recht neuen g++ benutzt (Vermutlich 3.4), der war nämlich nicht immer so streng. Der MSVC 6 ist von 1998 und erfüllt den Standard eher rudimentär (wenn du mal ein bisschen mit templates spielst, wirst du das schnell merken), von daher würde ich da generell dem g++ vertrauen.



  • > Wenn du wüsstest was der Standard ist, wüsstest du wie man main zu deklarieren hat.

    Es gibt halt so diverse C++ Tutorials im Internet wo das falsch erklärt wird - meine meisten Programme haben nicht mal eine main Funktion 😉 - WinMain()
    Da ich aber gerade durch das Studium bedingt anständiges C++ lernen muss bin ich darauf zufällig gestoßen...

    > Der Standard definiert folgende Formen von main

    ist auch int main(void) erlaubt nach dem Standard?

    ich dachte void main(void) ist das gleiche wie main() - weil g++ bei main() nicht mekert...

    (mir ist gerade aufgefallen das ich schon 1000 Beiträge gepostet habe ;)Mitglied)



  • Hallo,

    void ist ein "c-relikt". foo(void) bedeutet in c dass keine parameter erwartet werden während foo() beliebige paramter erwartet.

    In c++ bedeutet foo() dass keine parameter gewollt sind.



  • also main(void) wäre nicht teil des Standards?



  • AFAIK nicht. Ich beziehe mich damit auf eine Aussage aus einem anderen thread. Ich weiss jedoch nicht mehr wers gepostet hat. War auf jedenfall einer von den koriphäen hier. 🙂



  • main()
    

    eigentlich auch nicht, das geht nur in C89. C99 und C++98 verlangen, dass der Typ einer Funktion explizit deklariert wird (in C89 wäre das äquivalent zu int main()). Was int main(void) angeht, zumindest erklärt es der C++-Standard nicht als standardkonform. Ich bin nicht mal sicher, ob int foo(void) im C++-Standard noch erlaubt ist, jedenfalls macht es in C++ (anders als in C) nichts anderes als int foo().

    Wie gesagt, C++ definiert

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

    C99 dagegen definiert

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

    In beiden Fällen läuft es auf int als Rückgabewert und entweder keine Parameter oder int als ersten und char *[] als zweiten Parameter hinaus.



  • > Das letzte Ereigniss das C++ seinen heutigen Charakter verliehen hat war 1997.

    Das habe ich bisher gedacht - anscheinend wurde C++ doch noch ein paar mal überarbeitet - wann war das letzte "Update"?



  • Vertexwahn schrieb:

    also main(void) wäre nicht teil des Standards?

    Geht es um das void oder um den fehlenden Rückgabetyp? Ersteres ist erlaubt, letzteres nicht.



  • > Geht es um das void oder um den fehlenden Rückgabetyp? Ersteres ist erlaubt, letzteres nicht.

    es ging eigentlich um beides 😉

    ist jetzt "int main(void)" standardkonform...?
    0xdeadbeef meinte dass das C99 ist und eine Non-Standard-Erweiterung



  • Vertexwahn schrieb:

    > Das letzte Ereigniss das C++ seinen heutigen Charakter verliehen hat war 1997.

    Das habe ich bisher gedacht - anscheinend wurde C++ doch noch ein paar mal überarbeitet - wann war das letzte "Update"?

    Es gab ein paar Klarstellungen, aber der Standard steht seit 1998. Allerdings gab es 1998 noch keinen Compiler, der den Kram vollständig unterstützte - sowas zu implementieren braucht halt ne Weile.

    Was int main(void) angeht, der C++-Standard erklärt ausdrücklich int main() und int main(int argc, char *argv[]) als Formen von main, die jeder Compiler übersetzen können muss. Ein Compiler darf auch mehr akzeptieren, und die meisten Compiler werden wohl auch int main(void) fressen, aber um größtmögliche Portabilität zu garantieren, sollte man sich an die beiden im Standard genannten Formen halten (ich sehe auch keinen Grund, das nicht zu tun).



  • int main(void) ist aber exakt äquivalent zu int main() (jedenfalls in C++)



  • Es mag vom Effekt her gleich sein, aber der Standard behandelt main nun mal gesondert und schreibt diese beiden Signaturen als zwingend gültig für alle Compiler vor. Bei entsprechend strenger Auslegung könnte ein Compilerbauer also int main(void) ablehnen - zum Beispiel, wenn jemand sowohl Informatik als auch Jura studiert hat ;).

    Ich sage ja nicht, dass das sinnvoll wäre oder dass das wirklich mal jemand tun würde, aber es wäre theoretisch möglich, und ich sehe keinen wirklich guten Grund, int main(void) statt int main() zu schreiben.



  • nur so nebenbei - vielleicht sollte man diesen Beitrag später einmal in die FAQ aufnehmen


Anmelden zum Antworten