do {...} while (0)
Jerry Feldman
gaf at blu.org
Sat Feb 7 09:08:12 EST 2009
On 02/06/2009 04:53 PM, Michael ODonnell wrote:
>
>> What I see confufsing is:
>> do { ... } while(0);
>> What this means is to go through the loop once. You need a leading
>> curly so you can set up counter as a local variable as variable
>> names are block scope. { ... } would be equivalent to above.
>>
>
> They're definitely not equivalent - that's why you see do-while(0) so
> often. Try this (admittedly stupid) little program to demonstrate:
>
> #define b0rken(x) {return x;}
> #define works(x) do {return x;} while(0)
>
> int main( int argc, char **argv )
> {
> if( argc > 1 )
> b0rken( argc ); /* Try works() here, instead */
> else
> return( 42 );
> }
>
This is a totally different thing. In your line:
b0rken( argc );
The expansion is
{return arc;};
Note the closing ';'.
The reason the works macro compiles is that while(0) requires a
semicolon. In other words, in b0rken, is syntactically incorrect as a
macro.
But if you change the macro to:
#define b0rken(x) ({return x;})
you will find that the compiler likes it again. it has nothing to do with { ... } vs. do { ... ] while(0); In your example it is about the correct compiler syntax. Basically { .. } defines a block.
Do statement while(expression)
is a statement, so do { ... } while(0) must be terminated by a semicolon because the semicolon terminates a statement. As I stated before, do { ... while(0) generates code to handle the loop. Because the while(0) contains a constant, most compilers can figure that out at parse time.
--
Jerry Feldman <gaf at blu.org>
Boston Linux and Unix
PGP key id: 537C5846
PGP Key fingerprint: 3D1B 8377 A3C0 A5F2 ECBB CA3B 4607 4319 537C 5846
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 251 bytes
Desc: OpenPGP digital signature
Url : http://mail.gnhlug.org/mailman/private/gnhlug-discuss/attachments/20090207/9d9a2a46/attachment.bin
More information about the gnhlug-discuss
mailing list