for int i=0



  • Der folgende Quelltextabschnitt (mit erneuter lokaler Vereinbarung von i) wird von Visual C++ 7/NET anstandslos "geschluckt", nicht aber von anderen C++-Compilern - warum?

    for (int i = 0; i < 10; i++) cout << i;
    for (int i = 0; i < 10; i++) cout << i*i;
    

    .



  • Also bei mir geht der Code...



  • Auf welchen Compilern sollte es denn nicht gehen (mit meinem VC++6 funzt's).

    Es wird vielleicht mit C Compilern nicht gehen, aber eigentlich ist das doch alles Standardkonform (Hoffentlich krieg ich nicht gleich wieder was auf die Nase, weils net stimmt 😉 )



  • sollte bei modellen, die nicht allzu alt sind eigentlich funktionieren.
    ansonsten einfach

    #define for if(0);else for
    

    oder die for-schleife nochmal extra in klammern setzen.



  • davie schrieb:

    sollte bei modellen, die nicht allzu alt sind eigentlich funktionieren.
    ansonsten einfach

    #define for if(0);else for
    

    oder die for-schleife nochmal extra in klammern setzen.

    So ein Makro hab ich jetzt schon mehrmals gesehen, aber was bringt es eigentlich genau?



  • du bekommst ein neues scope, sowie in

    int i;
    if (foo) { //neues scope
      int i;   //anderes i
    }
    

    vor dem standard (ich kenn mich mit der geschichte nicht so genau aus, also bitte nachsicht) - auf jedenfall früher war es üblich, dass variablen, die im kopf einer for schleife definiert wurden, nicht nur in der for-schleife gültig waren, sondern sich ihr gültigkeitsbereich bis zum schluss des darüberliegenden scopes erstreckte:

    for (int i = 0; i < 10; ++i) cout << i << endl;
    i = 20; //unter standard c++ nicht mehr erlaubt
    

    das hat sich aber geändert.
    ältere compiler beherrschen die "neuen" regeln deshalb nicht.
    dafür gibt es eben diesen workaround.
    sollte man aber wirklich nur bei alten compilern verwenden, da zb der gcc dich warnt (aussagekräftig), wenn du nach den alten regeln programmierst. und compilermagie ist immer besser als irgendwelche defines.


Anmelden zum Antworten