Wie schaut eigentlich in c++ die korrekte main Daklaration aus



  • so? int main (int argc, char* argv[]) == AnSi C oder?
    oder so void main(void)?? oder wie genau nach den Programmierrichtlinien?

    thx



  • Es gibt in C++ genau zwei korrekte Deklarationen für main:

    int main();
    

    und

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

    MfG Jester



  • Jester schrieb:

    Es gibt in C++ genau zwei korrekte Deklarationen für main:

    int main();
    

    und

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

    MfG Jester

    int main(void);
    

    geht auch

    mfg



  • void foo() == void foo(void)
    wobei void foo(void) hässlich ist.



  • Shade Of Mine schrieb:

    void foo() == void foo(void)
    wobei void foo(void) hässlich ist.

    wobei void foo() hässlich, da es implizite typumwandlung begünstigt und ein schlechter stil ist.

    mfg



  • @terraner: Begründung?



  • int main(); <--- mit ; ??
    


  • terraner schrieb:

    wobei void foo() hässlich, da es implizite typumwandlung begünstigt und ein schlechter stil ist.

    Welche Typenumwandlung?

    Es ist in C++ so, dass man versucht Keywords einzusparen - deshalb schreibt man gerne void foo() anstatt void foo(void) - da das zusätzliche void keinen Vorteil bringt, und lediglich mehr schreibarbeit ist.

    Ich schreibe ja auch nicht unsigned int, weil unsigned reicht 😉 Und man schreibt void foo(int) und nicht void foo(int const) - weil es eben mehr Information als notwendig ist. Und genau das versucht man zu vermeiden.



  • Shade Of Mine schrieb:

    terraner schrieb:

    wobei void foo() hässlich, da es implizite typumwandlung begünstigt und ein schlechter stil ist.

    Welche Typenumwandlung?

    bei überladenen funktionen, bei Klassenmethoden.

    Es ist in C++ so, dass man versucht Keywords einzusparen - deshalb schreibt man gerne void foo() anstatt void foo(void) - da das zusätzliche void keinen Vorteil bringt, und lediglich mehr schreibarbeit ist.

    Ich schreibe ja auch nicht unsigned int, weil unsigned reicht 😉 Und man schreibt void foo(int) und nicht void foo(int const) - weil es eben mehr Information als notwendig ist. Und genau das versucht man zu vermeiden.

    ok, an die viele "schreibarbeit" habe ich bis jetzt nicht gedacht. bei einem größeren projekt, dürfte sich das dann doch irgendwann bemerkbar machen...

    mfg



  • terraner schrieb:

    bei überladenen funktionen, bei Klassenmethoden.

    ? erläutern.



  • @terraner:

    bevor wir jetzt noch 5mal nachfragen müssen, bis wir's verstanden haben:

    Könntest Du einfach mal ein Beispiel posten, bei dem durch Verwendung von

    void foo()
    

    Probleme entstehen, die durch

    void foo(void)
    

    vermieden werden.

    Danach wird irgendjemand bestimmt klarer sehen.

    MfG Jester



  • terraner schrieb:

    ok, an die viele "schreibarbeit" habe ich bis jetzt nicht gedacht. bei einem größeren projekt, dürfte sich das dann doch irgendwann bemerkbar machen...

    Es geht hierbei weniger um die Schreibarbeit als darum dass mehr 'Informationen' da sind als nötig. Im Grunde ist es ja keine Information - es ist so als würdest du sagen:
    Gestern ritt ich auf einem vierbeinigen Pferd

    Es ist zwar korrekt - aber dennoch unnötig. Deshalb tendiert man in C++ dazu, alles unnötige wegzulassen.

    Vergleiche:
    const unsigned short int foo()
    mit
    unsigned short foo()

    sie sind beide identisch, aber die 2. Variante ist deutlich besser zu lesen.



  • In K&R-C gab es zwar Funktionsdeklarationen, aber darin wurden nur die Rückgabetypen, nicht die Argumenttypen festgelegt. Beispiel: int printf(); wobei diese Deklaration redundant ist, weil int () sowieso für alle undeklarierten Funktionen angenommen wurde. Später kamen dann die ersten Entwürfe zu ANSI-C, die auch Deklarationen im C++-Stil (Prototypen genannt) zuließen. Die korrekte Deklaration zu printf wär also danach: int printf(const char* format, ...); Die alte Form blieb aus Kompatibilitätsgründen allerdings erhalten. Dh () bedeutet einfach beliebige Argumente. Als Workaround wurde (void) eingeführt, um eine leere Argumentliste anzuzeigen.
    In C++ gibt es keine K&R-Style Deklarationen, jede Funktion muß vor ihrer Benutzung mit der kompletten Argumentliste deklariert werden. () heißt dabei logischerweise leere Argumentliste. Der C-Workaround (void) ist in C++ wiederum nur aus Kompatibilitätsgründen enthalten, ansonsten aber eigentlich unlogisch und unpassend. Genauso wie structs quasi-automatisch mit typedef zu versehen, oder Variablen zwanghaft am Blockanfang zu deklarieren ... C++ hat einen eigenen Stil, man sollte die alten C-ismen nicht unbedingt kopieren.



  • int main(int argc);
    

    ist nicht legal? 😞



  • Nö.


Log in to reply