====================================================================
There are a couple of reasons:
- (from Dave Miller) Empty statements give a warning from the compiler so this is why you see #define FOO do { } while(0).
- (from Dave Miller) It gives you a basic block in which to declare local variables.
- (from Ben Collins) It allows you to use more complex macros in
conditional code. Imagine a macro of several lines of code like:
#define FOO(x) \
Now imagine using it like:
printf("arg is %s\n", x); \
do_something_useful(x);
if (blah == 2)
This interprets to:
FOO(blah);
if (blah == 2)
As you can see, the if then only encompasses the printf(), and the do_something_useful() call is unconditional (not within the scope of the if), like you wanted it. So, by using a block like do{...}while(0), you would get this:
printf("arg is %s\n", blah);
do_something_useful(blah);;
if (blah == 2)
Which is exactly what you want.
do {
printf("arg is %s\n", blah);
do_something_useful(blah);
} while (0); - (from Per Persson) As both Miller and
Collins point out, you want a block statement so you can have several lines
of code and declare local variables. But then the natural thing would be to
just use for example:
#define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }
However that wouldn't work in some cases. The following code is meant to be an if-statement with two branches:
if(x>y)
But it would be interpreted as an if-statement with only one branch:
exch(x,y); // Branch 1
else
do_something(); // Branch 2
if(x>y) { // Single-branch if-statement!!!
The problem is the semi-colon (;) coming directly after the block.
int tmp; // The one and only branch consists
tmp = x; // of the block.
x = y;
y = tmp;
}
; // empty statement
else // ERROR!!! "parse error before else"
do_something();
The solution for this is to sandwich the block between do and while(0). Then we have a single statement with the capabilities of a block, but not considered as being a block statement by the compiler.
Our if-statement now becomes:
if(x>y)
do {
int tmp;
tmp = x;
x = y;
y = tmp;
} while(0);
else
do_something();
Ketan
On 8/30/05, Gaurav Dhiman <gaurav4lkg@xxxxxxxxx> wrote:
Hi,
Can someone tell me why we use constructs like as follows:
do{
....
....
....
}while(0);
what the use of this, why we put the instructions in do while loop when the loop have condition zero. I have seen such constructs at number of places in kernel code.
also read on some site the benefit of such constructs, but my memory is not that good to recover it.
regards,
-Gaurav