繁体   English   中英

在C中的另一个宏内获取宏参数

[英]Taking macro argument inside a different macro in C

为什么这没有给出期望的输出? 对于Ex-取a = 1,b = 2,c = 3,d = 4它给出MAX4()= 2,但在这种情况下应为4。

#include<stdio.h>
#define MAX4(a,b,c,d) MAX2(MAX2(a,b),MAX2(c,d))
#define MAX2(a,b) a>b?a:b 

int a,b,c,d;

int main(){

    /*printf("Please enter 2 integers - \n");
    scanf("%d %d",&a,&b);   
    printf("The maximum number among them is %d\n",MAX2(a,b));
    */
    printf("Please enter 4 integers - \n");
    scanf("%d %d %d %d",&a,&b,&c,&d);   
    printf("The maximum number among them is %d\n",MAX4(a,b,c,d));//,MAX2(a,b),MAX2(c,d));

    return 0;
}

您需要添加括号以强制求值顺序:

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

需要在参数周围MAX2(a + 1, b + 2)括号以允许类似MAX2(a + 1, b + 2)表达式。

宏只是进行文本替换。 因此, 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宏,则可能仍然会遇到问题。

在您的宏中

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)) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM