在C中使用宏观参数在不同的宏内

时间:2016-04-01 16:17:03

标签: c macros

为什么这不能提供所需的输出?对于Ex - 取a = 1,b = 2,c = 3,d = 4它给出MAX4()= 2,而在这种情况下它应该是4。

id="id_of_angular_content"

3 个答案:

答案 0 :(得分:3)

您需要添加括号以强制执行评估顺序:

#define MAX2(a,b) ((a)>(b)?(a):(b)) 

需要围绕参数的额外括号以允许使用MAX2(a + 1, b + 2)等表达式。

答案 1 :(得分:3)

宏只是做文本替换。所以MAX4调用首先在其参数中展开宏,给出

    MAX2(a>b?a:b,c>d?c:d)

然后扩展到

    a>b?a:b>c>d?c:d?a>b?a:b:c>d?c:d

当编译器然后解析扩展的宏时,>(高于?:)的优先级导致这不符合您的预期。在宏中使用额外的括号可以避免优先级问题,但如果在带有副作用的表达式上调用MAX2宏,则可能仍会出现问题。

答案 2 :(得分:2)

在你的宏中

MAX4(a,b,c,d);

如果a = 1,b = 2,c = 3,d = 4则宏变为

MAX4(1,2,3,4);

反过来会成为

MAX2(MAX2(1,2),MAX2(3,4))

因此评估为

MAX2(1>2?1:2,3>4?3:4) 

1>2?1:2>3>4?3:4?1>2?1:2:3>4?3:4

并根据运算符优先级和关联性得到2而不是4。

为了获得4,你应该使用

#define MAX2(a,b) ((a)>(b)?(a):(b))