Wiki Markup |
---|
Parenthesize all variable names in macro definitions. See also \[[PRE02|PRE02-A. Macro expansion must always be parenthesized]\]. |
Non-Compliant Code Example
...
Code Block |
---|
#define CUBE(I) (I * I * I) int ca = 81 / CUBE(2 + 1); |
As a result, the invocation
Code Block |
---|
int ca = 81 / CUBE(2 + 1); |
expands to
...
Parenthesizing all variable namesthe names the in the {{CUBE()
}} macro allows it to expand correctly (when invoked in this manner).
Code Block |
---|
#define CUBE(I) ( (I) * (I) * (I) ) int ca = 81 / CUBE(2 + 1); |
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 |
---|
int a = 81 / CUBE(i++); |
expands to:
Code Block |
---|
int a = 81 / (i++ * i++ * i++); |
Wiki Markup |
---|
which is undefined (see \[[EXP30|EXP30-C. Do not depend on order of evaluation between sequence points]\]). |
Priority: P3 Level: L3
Component | Value |
---|---|
Severity | 1 (low) |
Likelihood | 1 (unlikely) |
Remediation cost | 3 (low) |
...