2012-01-07 36 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 
$