Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

This CUBE() macro definition is non-compliant because it fails to parenthesize the macro expansion.

Code Block
bgColor#FFcccc
#define CUBE(X) (X) * (X) * (X)
int i = 3;
int a = 81 / CUBE(i);

As a result, the invocation

Code Block
bgColor#FFcccc
int a = 81 / CUBE(i);

expands to

Code Block
bgColor#FFcccc
int a = 81 / i * i * i;

which evaluates as

Code Block
bgColor#FFcccc
int a = ((81 / i) * i) * i);  /* evaluates to 243 */

while the desired behavior is

Code Block
bgColor#FFcccc
int a = 81 / ( i * i * i); /* evaluates to 3 */

...

By parenthesizing the macro expansion, the CUBE() macro expands correctly (when invoked in this manner).

Code Block
bgColor#ccccff
#define CUBE(X) ((X) * (X) * (X))
int i = 3;
int a = 81 / CUBE(i);

However, if a parameter appears several times in the expansion, the macro may not work properly if the actual argument is an expression with side effects. Given the CUBE() macro above, the invocation

Code Block
bgColor#ccccff
int a = 81 / CUBE(i++);

expands to

Code Block
bgColor#ccccff
int a = 81 / (i++ * i++ * i++);

...