Semikolon nach Makro erzwingen



  • Ich hab mal eine Frage hierzu...

    Bis jetzt hab ich immer (static_cast<void>(0)) benutzt um ein Semikolon zu erzwingen. Sollte ich lieber donothing() verwenden oder kommt das aufs Gleiche raus?



  • ich hab auch schon öfter

    #define SWAP(A,B) do { int t=a; a=b; b=t; } while(false)

    gesehen.



  • @;;
    Die Funktion hat den Nachteil, dass sie den Namespace `beschmutzt`, der Vorteil ist, dass es verständlicher ist.



  • Schleifen sollte man meiden um ; zu erzwingen. Denn es gibt leider dumme Compiler die dann nicht mehr inlinen 😞

    Ich finde volkards Variante am besten.

    allerdings heisst mein donothing() immer noop() 😉



  • Ok vielen Dank Leute, dann will ich das mal machen wie volkard und Shade. 🙂

    Aber ist dieses if(true) ... else wirklich notwendig?

    inline noop() {}
    
    #define SWAP(a,b) {int t=a;a=b;b=t;} noop()
    

    So meckert er auch schon wegen dem Semikolon. Wofür also noch das if(true) else ? (siehe volkards Beitrag)



  • ;; schrieb:

    So meckert er auch schon wegen dem Semikolon. Wofür also noch das if(true) else ? (siehe volkards Beitrag)

    if(a) SWAP(a,b); else SWAP(a,c);
    

    würde bei dir zu

    if(a)
      {int t=a;a=b;b=t;}
    noop();
    else
      {int t=a;a=c;c=t;}
    noop();
    

    werden. Was natürlich ein Syntax Fehler ist.

    Bei volkard würde es zu

    if(a)
      if(true){int t=a;a=b;b=tmp;}
      else donothing();
    else
      if(true){int t=a;a=c;C=tmp;}
      else donothing();
    

    werden.
    und das ist auch korrekt so.



  • wie wäre es mit

    #define SWAP(a,b) if(true) {int t=a;a=b;b=tmp;} else {}
    

    ?



  • die idee war ja ein semikolon zu erzwingen... 🙄



  • Wie kommt es das die Größen des Forums scheinbar alle macros benutzen?
    Wieso keine inline funktion, es gibt doch keinen Grund der ein Macro rechtfertigt.

    Falls doch, bitte melden 🤡



  • imwalde schrieb:

    Wie kommt es das die Größen des Forums scheinbar alle macros benutzen?

    tun sie nicht. die meisten makros siehste vermutlich bei den spieleprogramierern, wenn sie weidermal c statt c++ nehmen, weil es schneller sei.

    Wieso keine inline funktion, es gibt doch keinen Grund der ein Macro rechtfertigt.
    Falls doch, bitte melden 🤡

    #define DBREAK() {__asm int 3;}
    geht per inline-funktuin zwar auch, aber der debugger hängt dann in der inline-funktion statt genau auf der zeiloe, wo DBREAK steht.
    ASSERT muss auch ein makro sein, weil sonst __LINE__ und __FILE__ nicht sauber auflösen.
    das war's aber fast schon. selbstrerständlicg benutzen wir kein SWAP-makro. das war hier nur demo, wie das semikolon-problem gelöst werden kann.


Anmelden zum Antworten