从宏调用中调用宏

时间:2018-09-26 22:38:48

标签: c c-preprocessor

以下代码为什么不输出最多三个数字?

#include<stdio.h>

#define max(a,b) (a>b)?(a):(b)
#define min(a,b) (b>a)?(a):(b)

int main()
{
    printf("%d",max(2,max(1,4)));
    return 0;
}

结果是:

Output: 2

无法在宏调用内调用宏吗?

2 个答案:

答案 0 :(得分:3)

  

无法在宏调用内调用宏吗?

可以嵌套宏调用


要获得所需的功能,请将()放在每个参数周围,并将()放在整个表达式周围。

// #define max(a,b) (a>b)?(a):(b)
#define max(a,b) (((a)>(b)) ? (a) : (b))

在没有明智使用()的情况下,当参数在b的{​​{1}}的外部调用中像max(a,b)一样平凡时,代码可能无法按预期进行评估< / p>

答案 1 :(得分:1)

int loopCounter = 1扩展为max(2, max(1,4)) 注意 (2> (1>4)?(1):(4) )?(2):( (1>4)?(1):(4) )2> (1>4)?,这是正确的。所以2是值。

要解决此问题,请添加一些括号:)

2 > false == 2 > 0