Semikolon nach Makro erzwingen



  • Hi,

    wie erzwingt man am besten ein Semikolon nach einem Makro?



  • Zoran schrieb:

    Hi, wie erzwingt man am besten ein Semikolon nach einem Makro?

    indem das makro wenn man es ohne semikolon am end verwendet nen fehler macht? so sehen meine alle aus. ich hab kein semikolen am ende im makro-code und der makro-code endet nicht mit einer '}'.
    also statt

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

    lieber ein

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

    würde ich das nicht so machen, könnte ich makros nicht in normalem code wie normale befehler benutzen, denn das manchmal überflüssige semikolen würde nich ausstehende ifs vom else absperren und so katatrophale (für mich als fehlersuchenden) effekte feiern.



  • 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