Fragen zur main() Funktion



  • Guten Tag liebe Leute.
    Es ist ja so dass in vielen C++ Lehrbüchern recht wenig über den Zweck einer int main() Funktion beschrieben wird. Uns wird erklärt, das die Hauptfunktion, also die main() immer mit:

    int main() {}
    

    geschrieben werden soll, aber warum immer mit dem int main()? Warum nicht einfach nur: main()? So funktioniert das auch, der Compiler beschwert sich ja nicht.
    Bsp.:

    #include <iostream>
    main()
    {
      std::cout << "Hallo ihr suessen!!" << std::endl;
    }
    

    Oder: short int main() sogar long int main(). Wo sind für euch die Unterschiede?

    lg
    Sandor++



  • main ist die Schnittstelle zwischen deinem Programm und dem Betriebssystem, das dieses Programm ausführt. Diese Schnittstelle ist im C++-Standard definiert und muss für ein portables Programm genau so implementiert werden.

    Welchen Sinn sollte es haben, statt int short zu verwenden?



  • manni66 schrieb:

    Welchen Sinn sollte es haben, statt int short zu verwenden?

    Weil das eben funktioniert. Es wird nirgends genau geschildert, was die Unterschiede sind, zwischen: main() int main() short main() und long main()?

    Meine Frage hierzu wo sind die Unterschiede?



  • Sandor++ schrieb:

    manni66 schrieb:

    Welchen Sinn sollte es haben, statt int short zu verwenden?

    Weil das eben funktioniert. Es wird nirgends genau geschildert, was die Unterschiede sind, zwischen: main() int main() short main() und long main()?

    Meine Frage hierzu wo sind die Unterschiede?

    Im Rückgabetyp. Der ist zweimal int, einmal short und einmal long.
    main() verwendet allerdings C's "wenn ich keinen Rückgabetypen sehe, denk ich mir einfach int an der Stelle"-Feature, was es in C++ nicht mehr gibt -> nicht standardkonform.
    Die anderen Formen sind das genauso wenig. Der Standard schreibt die Signatur vor, dass das mit long oder short funktioniert muss nichts heißen.


  • Mod

    short main und long main sind, sofern sie funktionieren, unportable Spezialerweiterungen des Compilers/Systems, das du benutzt. Kann funktionieren, muss es aber nicht. Wird eventuell zu bösen Überraschungen führen. Gleiches gilt für das oft gesehene void main.

    Nur main, ohne was dran, ist das gleiche wie int main. Beziehungsweise: Es wäre das gleiche wie int main, sofern es sich um C im alten Stil handeln würde. In C war früher jede Funktion ohne angegebenen Rückgabetyp standardmäßig vom Rückgabetyp int. Das ist mittlerweile auch in C nicht mehr gültig (ab C99) und in C++ war das noch nie gültig. Wenn das bei dir funktioniert, ist das ebenfalls eine spezielle Erweiterung deines Compilers, der das vielleicht noch unterstützt, damit uralter Code noch funktioniert. Auch hier drauf kannst und solltest du dich nicht verlassen.


  • Mod

    Interessanter Fakt nebenbei: Auch Funktionsparameter waren standardmäßig int, sofern der cv-qualifier vorhanden war:

    void f( const a );
    

    Auch das ist natürlich in C++ nie möglich gewesen.



  • Danke SeppJ, jetzt ist mir so einiges klar! Ich nutze Visual c++ 2013 und den GNU Compiler für Linux. Klappt auf beidem Compiler.



  • Sandor++ schrieb:

    manni66 schrieb:

    Welchen Sinn sollte es haben, statt int short zu verwenden?

    Weil das eben funktioniert. Es wird nirgends genau geschildert, was die Unterschiede sind, zwischen: main() int main() short main() und long main()?

    Meine Frage hierzu wo sind die Unterschiede?

    Der Unterschied ist, dass int main() korrekt ist und die anderen nicht. Die anderen haben undefiniertes Verhalten. Undefiniert bedeutet, dass es funktionieren kann und darf. Ein Compiler dürfte das aber auch ablehnen. Nur weil der Compiler etwas nicht bemängelt, bedeutet nicht, dass es Standardkonform ist.

    Und welchen Sinn macht es, so etwas zu hinterfragen?


  • Mod

    Die anderen haben undefiniertes Verhalten.

    Nein. Das ist kein undefiniertes Verhalten, denn das heißt im Kontext des Standards etwas anderes.

    It [the main function] shall have a return type of type int , but otherwise its type is implementation-defined.
    All implementations shall allow both
    — a function of () returning int and
    — a function of ( int , pointer to pointer to char ) returning int
    as the type of main .

    Das heißt, rein theoretisch kann eine Implementierung dir auch eine Version a la

    int main( char const* first, char const* last )
    

    erlauben.



  • Also VS 2013 sagt mir da für main ohne int

    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int



  • tntnet schrieb:

    Und welchen Sinn macht es, so etwas zu hinterfragen?

    Ich hinterfrage deshalb weil ich C++ und wie sie funktioniert besser zu verstehen. Zu Fragen warum das so ist und nicht nur das es so ist reicht mir nicht. Denn wenn man mich später fragt, möchte ich auch gerne erklären können warum!


Log in to reply