semikolon hinter }



  • Wenn du umbedingt willst kannst du auch:

    { /*...*/ };;
    

    schreiben, ; sind im Code nie zuviel (das heist sofern sie am Ende einer Declaration oder eines Statements stehen)

    gerard is ja voll der noob

    Sowas denkt man, spricht man aber besser nicht aus.



  • mir war so als hätte ich in einer cuj was darüber gelessen, aber ich kanns nicht mehr finden 😞



  • Bist du sicher, dass das nicht im Zusammenhang mit:

    class A{};
    

    war.



  • Mich hat das auch grad ins straucheln gebracht, aber hatte nicht drangedacht, dass das ja alles innerhalb von Funktionen geschieht, von daher wüsst ich jetzt nicht wo es da nen Fehler geben könnte, außerhalb kann man das ja aber nicht aufrufen



  • SirLant schrieb:

    Mich hat das auch grad ins straucheln gebracht, aber hatte nicht drangedacht, dass das ja alles innerhalb von Funktionen geschieht, von daher wüsst ich jetzt nicht wo es da nen Fehler geben könnte, außerhalb kann man das ja aber nicht aufrufen

    Bitte?

    void foo(char*a)
    DBOUT(a)
    

    Die Regel ist doch ganz einfach : Hinter jedes struct/class/union/enum gehört ein ; ansonsten ist } immer das gleiche wie }; (und wie };; und };;;;;;;;) ganz blöde Compiler könnten es zwar vielleicht noch fertig bringen da eine Nooperation Instruktion dazwischen zu basteln aber ein solcher Compiler gehört definitiv in die digitale Mülltonne.



  • @gerard

    nicht die trolle füttern 😉

    meintest du den artikel?
    http://www.cuj.com/documents/s=8039/cuj0005schmidt/schmidt.htm

    muss man wohl aufpassen...



  • Gerard schrieb:

    wenn ich ein makro haben wie

    #define DBOUT(message)                          \
        {                                               \
            std::stringstream dbs;                      \
            (message);                                  \
            debug::detail::debug_stream_out( dbs );     \
        }
    

    benutzen kann man da so:

    DBOUT(dbs << "Hallo " << 10*10)
    

    aber was ich wenn jemand hinter DBOUT() ein semikolon setzt? das ganze expandiert dan zu ein { ... }; kann das ein problem verursachen?

    aber hallo! es wird probs verursachen.
    mach deine makros immer, daß sie ein semikolon brauchen. daß es ohne gar nicht geht.
    also so:

    #define DBOUT(message)                          \
        if(calculateTrue())                             \
        {                                               \
            std::stringstream dbs;                      \
            (message);                                  \
            debug::detail::debug_stream_out( dbs );     \
        }                                               \
        else                                            \
           doNothing();
    

    benutzen kann man da so:

    DBOUT(dbs << "Hallo " << 10*10);
    

    edit: ach, ichr findet schon den fehler.



  • Irgendwer schrieb:

    SirLant schrieb:

    Mich hat das auch grad ins straucheln gebracht, aber hatte nicht drangedacht, dass das ja alles innerhalb von Funktionen geschieht, von daher wüsst ich jetzt nicht wo es da nen Fehler geben könnte, außerhalb kann man das ja aber nicht aufrufen

    Bitte?

    void foo(char*a)
    DBOUT(a)
    

    Ich dachte dabei eigentlich an unbewusste Nebeneffekte und nicht an einen bewussten Missbrauch des Makro's.



  • randa schrieb:

    nein.

    sag doch sowas nicht.

    #define DBOUT(message)                          \ 
    {                                               \ 
        std::stringstream dbs;                      \ 
        (message);                                  \ 
        debug::detail::debug_stream_out( dbs );     \ 
    }
    
    void test(X x,A a){
       if(x)
          if(a)
             DBOUT("a");
          else
             cout<<"x aber nicht a";
    }
    

    das else bindet an das if(x) und nicht wie zu erwarten an das if(a).



  • danke ihr habt mich gerettet 🙂


Anmelden zum Antworten