...
This CUBE()
macro definition is non-compliant because it fails to parenthesize the macro expansion.
Code Block |
---|
|
#define CUBE(X) (X) * (X) * (X)
int i = 3;
int a = 81 / CUBE(i);
|
As a result, the invocation
Code Block |
---|
|
int a = 81 / CUBE(i);
|
expands to
Code Block |
---|
|
int a = 81 / i * i * i;
|
which evaluates as
Code Block |
---|
|
int a = ((81 / i) * i) * i); /* evaluates to 243 */
|
while the desired behavior is
Code Block |
---|
|
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 |
---|
|
#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 |
---|
|
int a = 81 / CUBE(i++);
|
expands to
Code Block |
---|
|
int a = 81 / (i++ * i++ * i++);
|
...