Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > C++ faq 38.5 - macros with multiple statements

Reply
Thread Tools

C++ faq 38.5 - macros with multiple statements

 
 
Erik Haugen
Guest
Posts: n/a
 
      01-08-2004
This item in the C++ faq:
http://www.parashift.com/c++-faq-lit....html#faq-38.5

discusses macros with multiple statements.

The problem is that a macro such as

#define MYMACRO(a,b) stmt1; stmt2;

will cause unwanted astonishment if you say:

while(whatever)
MYMACRO(foo,bar);


This is also problematic:

#define MYMACRO(a,b) {stmt1; stmt2;}

because this won't compile:
if(foo())
MYMACRO(i,j);
else
baz();

since you can't have "}; else"


so the faq proposes this solution:

-------------
#define MYMACRO(a, b) \
if (true) { \
statement1; \
statement2; \
... \
statementN; \
} else
-------------

But this seems like a bad solution; what if you write this:

MYMACRO(foo,bar) // note no semicolon
baz();

it compiles fine, but baz() *never* gets called!

Is there a way to avoid this? Maybe the do/while idiom should be used
dispite the inlining problems?

// compiler may not inline functions that use this because of the loop...
#define MYMACRO(a, b) \
do { \
statement1; \
statement2; \
... \
statementN; \
} while (false)

thanks,
Erik

 
Reply With Quote
 
 
 
 
David Fisher
Guest
Posts: n/a
 
      01-08-2004
"Erik Haugen" <(E-Mail Removed)> wrote:

> This item in the C++ faq:
> http://www.parashift.com/c++-faq-lit....html#faq-38.5
>
> discusses macros with multiple statements.


[snip]

> the faq proposes this solution:
>
> -------------
> #define MYMACRO(a, b) \
> if (true) { \
> statement1; \
> statement2; \
> ... \
> statementN; \
> } else
> -------------
>
> But this seems like a bad solution; what if you write this:
>
> MYMACRO(foo,bar) // note no semicolon
> baz();
>
> it compiles fine, but baz() *never* gets called!
>
> Is there a way to avoid this? Maybe the do/while idiom should be used
> dispite the inlining problems?


How about this:

#define MYMACRO(a, b) \
if (true) { \
statement1; \
statement2; \
} else true

This makes the null statement explicit, and should cause a syntax error if
no semi colon follows (if this looks weird to anyone, an expression that
does nothing like "true" or "1+3" is a valid statement in C++).

The following cases mentioned in the FAQ should work OK:

while (whatever)
MYMACRO(foo, bar);

if (whatever)
MYMACRO(foo, bar);
else
baz;

And there will be a (possibly obscure !) syntax error if the semi colon is
missing, as in your example:

MYMACRO(foo,bar) // note no semicolon
baz();

- because it will expand to "true baz()" at the end.

The reason for using "true" as the null statement and not "0" is because
there is less chance of the statement still being valid without a semi
colon, eg. something beginning with "-" or "*".

Hope this helps - let me know if I've missed something !

David F




 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
macros-loop? calling macros X times? Andrew Arro C Programming 2 07-24-2004 09:52 AM
Explanation of macros; Haskell macros mike420@ziplip.com Python 80 11-07-2003 02:22 AM
Re: Explanation of macros; Haskell macros Michael T. Babcock Python 0 11-03-2003 01:54 PM
Re: Explanation of macros; Haskell macros mike420@ziplip.com Python 5 11-01-2003 01:09 AM
Re: Explanation of macros; Haskell macros mike420@ziplip.com Python 1 10-07-2003 04:07 PM



Advertisments