Use of Parentheses in Macros

When a macro's replacement list is an expression, it should be enclosed in parentheses. Otherwise, the following may happen:

#define TWO_PI 2 * 3.14159

conversion_factor = 360 / TWO_PI;
/* conversion_factor = 360 / 2 * 3.14159; */
/* you really wanted: 360 / ( 2 * 3.14159 ) */
In a parameterized macro, each parameter should be enclosed in parentheses. If not, this may happen:

#define scale(x) (x * 10)

j = scale( i + 1 ); /* j = ( i + 1 * 10 ); */
/* your really wanted: ( ( i + 1 ) * 10 ) */
So be sure to use parentheses in you macro definitions:

#define max(x,y) ( x > y ) ? x : y   /* bad */
#define max(x,y) (((x)>(y))?(x):(y)) /* good */
Now consider the following use of a macro:

#define max(x,y) (((x)>(y))?(x):(y)) /* good */

x = max(a++,b++);
Assuming that a is 2 and b is 4 before max() is executed, we would expect, after executing the macro, to have a = 3 and b = 5, with x = 4.
Notice that the substitution of the macro yields:

x = ((a++)>(b++))?(a++):(b++));
So after the macro is executed a = 3 as expected, but b = 6, and x = 5. Clearly not what we intended! This occurs because b gets incremented twice in the code instead of just once. Since the other part of the conditional operator did not get executed, a was incremented only once. Unfortunately, all the parentheses in the world cannot correct this problem. So you must still be careful how you use macros in your program.