2012-01-07 53 views
-1

我收到以下警告:如何修复这些MIN,MAX宏?

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) 

这是一个很奇怪的宏定义。

+2

你能显示来电所在部位报警被触发? (标记为GCC,宏使用GCC扩展。) – Mat 2012-01-07 15:09:54

+0

请问[this](http://stackoverflow.com/questions/3437404/min-and-max-in-c)有帮助吗? – 2012-01-07 15:12:33

+0

我在代码中看不到一个逗号。所以我想这个问题出现在使用宏的代码中(可能包含一个逗号),而不是宏本身。 – ugoren 2012-01-07 15:23:10

回答

1

错误不在您的宏定义中。

您需要向我们显示调用代码为MIN/MAX宏。这听起来像是要么尝试使用MIN/MAX的结果不正确,要么您已通过包含意外逗号的令牌(ab)。

-2

_a < _b ? _a : _b是一个表达式,而不是一个语句,但是您已经将它写为一个语句(全部由它自己后跟一个分号)。

+3

'({...})'是一个GCC扩展,*是一个表达式(对最后一个“语句”的结果进行评估)。如果不是,你会得到一个语法错误。如果以某种方式避免了这种情况,您可能会得到不同的警告(例如“语句无效”) - 宏中没有逗号运算符。 – delnan 2012-01-07 15:16:40

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 
$