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.