l i n u x - u s e r s - g r o u p - o f - d a v i s
L U G O D
 
Next Meeting:
September 2: Social gathering
Next Installfest:
TBD
Latest News:
Aug. 18: Discounts to "Velocity" in NY; come to tonight's "Photography" talk
Page last updated:
2007 Jan 19 12:20

The following is an archive of a post made to our 'vox-tech mailing list' by one of its subscribers.

Report this post as spam:

(Enter your email address)
Re: [vox-tech] Nifty macro expansion bug
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [vox-tech] Nifty macro expansion bug



On Thu, Jan 18, 2007 at 04:14:22PM -0800, Bill Kendrick wrote:
> See, myFREE() is actually a macro that looks like this:
> 
>   #define myFREE(x) if ((x) != NULL) FREE(x); x = NULL;
> 
> Two statements... hence the need for {} around the call to the macro.
> (Or, more sensibly, including {}s around what the macro expands to.)

As Gabe points out, macros should be enclosed in do{}while(0), but
defined constants with expressions should also be enclosed.  Consider
the following code:

  1: #define myConstant1     5000
  2: #define myCosntant2     myConstant1 + 2000
  3:
  4: int main() {
  5:   printf("%d\n", myConstant2 * 2);
  6: }

The expected output is 14000 ((5000+2000) * 2), but the actual output is
9000 (5000 + (2000*2)) because multiplication has higher operator
precedence than the addition.  To avoid this problem, modify the
definition of myConstant2:

  #define myCosntant2  (myConstant1 + 2000)

As a rule of thumb, make sure every #define is enclosed in something.


Another interesting case is comments on the define lines.  Consider the
case where we add C++ comments to a defined constant:

  #define myConstant2  (myConstant1 + 2000)  // my 2nd constant

expands line 5 into:

    printf("%d\n", (5000 + 2000) // my 2nd constant * 2);

in *some* compilers, which causes compiler error.  To aleviate this
problem, switch to C++-style comments:

  #define myConstant2  (myConstant1 + 2000) /* my 2nd constant */

which expands line 5 into:

    printf("%d\n", (5000 + 2000) /* my 2nd constant */ * 2);

and won't cause problems.

-Mark

_______________________________________________
vox-tech mailing list
vox-tech@lists.lugod.org
http://lists.lugod.org/mailman/listinfo/vox-tech



LinkedIn
LUGOD Group on LinkedIn
Sign up for LUGOD event announcements
Your email address:
facebook
LUGOD Group on Facebook
'Like' LUGOD on Facebook:

Hosting provided by:
Sunset Systems
Sunset Systems offers preconfigured Linux systems, remote system administration and custom software development.

LUGOD: Linux Users' Group of Davis
PO Box 2082, Davis, CA 95617
Contact Us

LUGOD is a 501(c)7 non-profit organization
based in Davis, California
and serving the Sacramento area.
"Linux" is a trademark of Linus Torvalds.

Sponsored in part by:
EDGE Tech Corp.
For donating some give-aways for our meetings.