main() rekursiv ;-)



  • #include <iostream>
    
    int main()
    {
     static int i;
     ++i;
     std::cout << i << " ";
     main();   
    }
    

    Bricht bei 43389 ab. Ist da der stack für Funktionsaufrufe voll? Wie kann man das verändern?



  • in compileroptionen kannst du die stackgröße ändern.

    main rekursiv aufzurufen is aber nicht gern gesehen... steht glaub ich im standard... mach lieber ne eigene funktion dafür die das macht.



  • Im Standard steht sogar dass es verboten ist ⚠



  • #include <cstdlib>
    #include <iostream>
    using namespace std;
    
    int main(int argc, char *argv[]) {
    
       cout << "hallo" << endl;
       system(argv[0]);
       return 0;
    
    }
    

    Daran hat bestimmt niemand gedacht, das zu verbieten 😃



  • 3.6.1 Main function: ...
    "The function main shall not be used (3.2) within a program."

    3.2 One definition rule



  • shall not -> sollte nicht oder?
    must not -> darf nicht



  • In diesem Falle eher "shall not" im Sinne von "so solle es sein"

    Klar, dürfen darfst Du vieles, auch über Arraygrenzen hinwegschreiben 😃 - nur dass das dann keinen definierten Effekt hat.



  • In dem Fall ist es ein Gebot, aber die kann man misachten (genauso wie man sich auch nicht an den Standard halten kann). Ob das gut ist, muss jeder selber wissen.



  • Ein standardkonformer Compiler muss zumindest warnen. MSVC++ 2005 auf Warnstufe 4:

    warning C4717: 'main' : recursive on all control paths, function will cause runtime stack overflow
    


  • Storm.Xapek.de schrieb:

    #include <cstdlib>
    #include <iostream>
    using namespace std;
    
    int main(int argc, char *argv[]) {
    
       cout << "hallo" << endl;
       system(argv[0]);
       return 0;
    
    }
    

    Daran hat bestimmt niemand gedacht, das zu verbieten 😃

    Hier wird auch nicht main( ) direkt aufgerufen, sondern auch der (vom Compiler generierte) Code, der main( ) "bootstrapt".

    Greetz, Swordfish



  • Erhard Henkes schrieb:

    Ein standardkonformer Compiler muss zumindest warnen. MSVC++ 2005 auf Warnstufe 4:

    Naja, er warnt ja nicht vor Aufrufen von main, sondern vor einem drohenden Stack-Overflow...

    xeatre-devel:~/src# g++-4.1 -Wall -W -pedantic -std=c++98 main.c
    main.c: In function 'int main()':
    main.c:3: error: ISO C++ forbids taking address of function '::main'
    


  • Erhard Henkes schrieb:

    Ein standardkonformer Compiler muss zumindest warnen.

    Seit wann denn das? Ich dachte warnings seien ne freiwillige Sache der Compiler-hersteller?



  • Soweit ich weiß ist main() auch nichts anderes als eine normale Funktion. Aber von main() mal abgesehen, welchen Nutzen hat eine Rekursion ohne Abbruchbedingung?



  • sascha_kib schrieb:

    Soweit ich weiß ist main() auch nichts anderes als eine normale Funktion.

    Das ändert aber nichts am Standard, welchen Erhard Henkes vollkommen richtig zitiert hat.

    Greetz, Swordfish



  • hggdgdg schrieb:

    Seit wann denn das? Ich dachte warnings seien ne freiwillige Sache der Compiler-hersteller?

    Oftmals verwenden Compiler aber auch Warnungen bei Sachen, die zwar gegen den Standard verstossen, sich dennoch kompilieren lassen. Es heisst dann halt: Compilererweiterung. 😃
    Merke: nur weil es eine Warnung ist, bedeutet das noch lange nicht, dass du die Meldung ignorieren darfst. 😉



  • Warnungen sind für mich (fast) wie Fehler 😉 Also. FIXEN!



  • Nicht nur für Dich - ich muss regelmäßig meine Betatester beschwichtigen dass meine #warning's FÜR MICH gedacht sind und nicht wirklich auf Fehler hindeuten 😉



  • groovemaster schrieb:

    hggdgdg schrieb:

    Seit wann denn das? Ich dachte warnings seien ne freiwillige Sache der Compiler-hersteller?

    Oftmals verwenden Compiler aber auch Warnungen bei Sachen, die zwar gegen den Standard verstossen, sich dennoch kompilieren lassen. Es heisst dann halt: Compilererweiterung. 😃
    Merke: nur weil es eine Warnung ist, bedeutet das noch lange nicht, dass du die Meldung ignorieren darfst. 😉

    Das ändert aber nix daran, daß es falsch ist, daß ein standardkonformer Compiler warnen *muss*.



  • Jester schrieb:

    Das ändert aber nix daran, daß es falsch ist, daß ein standardkonformer Compiler warnen *muss*.

    Doch, muss er (wenigstens). Ansonsten wäre er ja nicht mehr standardkonform. 🙂


Log in to reply