Versions Compared

Key

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

Wiki Markup
Parenthesize all variable names in macro definitions. See also \[[PRE00-A. Prefer inline functions to macros]\] and \[[PRE02-A. Macro expansion should always be parenthesized for function-like macros]\].

Non-Compliant Code Example

...

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

...

Which is clearly not the desired result.

Compliant Solution

...

Parenthesizing all variable names in the CUBE() macro allows it to expand correctly (when invoked in this manner).

Code Block
bgColor#ccccff
#define CUBE(I) ( (I) * (I) * (I) )
int a = 81 / CUBE(2 + 1);

Non-Compliant Code Example (EOF)

In this example, EOF is defined without parenthesizing the -1. Additionally, the programmer mistakenly omitted the comparison operator from the conditional statement. After macro expansion, the conditional will be incorrectly evaluated as a binary operation: c-1.

Code Block
bgColor#FFcccc

#define EOF -1
/* ... */
if (c EOF) {
   /* ... */
}

Wiki Markup
Note that this example also violates \[[MSC02-A. Avoid errors of omission]\].

Compliant Solution (EOF)

Parenthesizing the -1 in the declaration of EOF does not correct the omission of the comparison operator, but it does ensure the -1 is evaluated as a unary operation.

Code Block
bgColor#ccccff

#define EOF (-1)
/* ... */
if (c EOF) {
   /* ... */
}

The code above will fail compilation as after macro expansion the conditional will evaluate to c(-1). To fully correct this example the error of omission must also be addressed.

Code Block
bgColor#ccccff

#define EOF (-1)
/* ... */
if (c == EOF) {
   /* ... */
}

Risk Assessment

Failing to parenthesize around the variable names within a macro can result in unintended program behavior.

...