如何修复这些MIN,MAX宏?

时间:2012-01-07 15:06:25

标签: c gcc

我收到以下警告:

warning: left-hand operand of comma expression has no effect

宏定义如下。我正在使用Linux上的GCC(4.4.3)进行编译。这是C代码。

#define MY_MAX(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a > _b ? _a : _b; })

#define MY_MIN(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a < _b ? _a : _b; })

如何修复它们以消除警告?

[[更新]]

实际上,我找到了警告的原因。它与宏本身无关。这是因为我试图找到两个数字的最小值,其中一个是名为MAXIMUM_ARRAYSIZE的#def。它被定义为:

#define MAXIMUM_ARRAYSIZE (sizeof(size_t)==2,16384,1073741824)

这是一个非常奇怪的宏定义。

3 个答案:

答案 0 :(得分:1)

错误不在您的宏定义中。

您需要向我们展示MIN / MAX宏的调用代码。听起来您要么错误地使用MIN / MAX的结果,要么您传递了包含意外的令牌(ab)逗号。

答案 1 :(得分:0)

我尝试了以下操作,并且在gcc -Wall没有任何警告/错误的情况下工作正常。检查你是如何使用这些宏的!

#include <stdio.h>

#define MY_MAX(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a > _b ? _a : _b; })

#define MY_MIN(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a < _b ? _a : _b; })

int main(void)
{
    printf("%d \n", MY_MAX(10,20));
    printf("%d \n", MY_MIN(10,20));
    return 0;
}

输出:

$ gcc ma.c -Wall
$ ./a.out 
20 
10 
$ 

答案 2 :(得分:-2)

_a < _b ? _a : _b是一个表达式,而不是一个语句,但是你把它写成了一个语句(所有这些语句本身后跟一个分号)。