Macro replacement lists should be parenthesized to protect any lower - precedence operators from the surrounding expression. See also \[[PRE00-A. Prefer inline functions to macros]\] and \[[PRE01-A. Use parentheses within macros around parameter names]\]. Wiki Markup
Non-Compliant Code Example
...
Code Block | ||
---|---|---|
| ||
#define EOF -1 /* ... */ if (c EOF) { /* ... */ } |
...
In this example, the programmer has mistakenly omitted the comparison operator (see \[[MSC02-A. Avoid errors of omission]\]) from the conditional statement, which should be {{c
\ !=
EOF
}}. After macro expansion, the conditional expression is incorrectly evaluated as a binary operation: {{c-1
}}. This is syntactically correct, even though it is certainly not what the programmer intended.
Parenthesizing the -1
in the declaration of EOF
ensures that the macro expansion is evaluated correctly.
...
Once this modification is made, the non-compliant code example no longer compiles as because the macro expansion results in the conditional expression c (-1)
, which is no longer syntactically valid.
...
Note that there must be a space after EOF
, because otherwise it becomes a function-like macro (and one that is incorrectly formed, since -1 cannot be a formal parameter).
...