Warum ein do-while(0) Block in Makros verwenden
-
Hallo,
warum sollte man laut Empfehlung in linux/Documentation/CodingStyle ein do-while(0) Block in mehrzeiligen Makros verwenden, z.B.:
#define do_this(a, b) \ do { \ a = b; \ b = 0; \ ... \ } while(0)
Ist das nur, damit der Code einheitlich wirkt oder steckt da ein gewisser Sinn dahinter?
-
Ja, es steckt ein Sinn dahinter - durch das do-while wird das Makro zu einer einzigen Anweisung und kann genauso wie ein Funktionsaufruf verwendet werden.
//primitivste Version: #define do_this(a,b) \ a=b; \ b=0; \ ... do_this(v1,v2);//klappt fehlerfrei if(input=='y') do_this(v1,v2); /* wird zu: if(input=='y') v1=v2; v2=0; ... Die Einrückungen sind für den Compiler egal - er hängt die erste Anweisung an das if() - und das ist nicht das komplette Makro, sondern nur das 'a=b;' */
-
blöd sind nur immer diese warnings: 'condition always false'
:xmas2:
-
So eine Warnung (die man im Ernstfall auch abschalten/ignorieren kann) ist mir auf jeden Fall lieber als ein Programm, das nicht macht was es soll
(eine bessere Lösung wäre es sowieso, anstelle des Makros eine Inline-Funktion zu verwenden - deren Aufruf IST eine einzelne Anweisung und muß auch nicht mit irgendwelchen do-while-Konstrukten eingeklammert werden)
-
Und was würde dagegen sprechen, Blockzeichen { und } zu verwenden, z.B. so:
#define do_this(a, b) \ { \ a = b; \ b = 0; \ ... \ }
-