2013-01-06 59 views
0

我們都知道這個著名的宏示例:最大宏的安全解決方案?

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

而且,因爲它使用ab兩次,當我們做到這一點變得不準確是這樣的:

max(x, y++); // because this gets translated to... 
((x) > (y++) ? (x) : (y++)); // y is incremented twice 

有效的C++,斯科特Meyers使用inline函數爲此提供了一個C++解決方案。

21世紀C,我希望有一個類似的C解決方案,但遺憾的是所有建議是避免雙重使用。這讓我難過。 :'(

當然,人們總是可以用常規的函數代替它,但我不知道是否有唯一的C-宏觀地解決了這個,這解決了雙重用途問題任何可能的解決方案

。?
+1

究竟爲什麼要避免宏每當possib而不是相反。 – dbrank0

+0

如果您對此感興趣,實際上有一篇關於C++解決方案的有趣文章[此處](http://www.drdobbs.com/generic-min-and-max-redivivus/184403774)。 – chris

+0

我沒有答案,但是,無法停止表達式:在條件中使用遞增/遞減運算符不是我的事情 - 我認爲這比編碼中的高雅性或方便性更加模糊(針對人爲錯誤)。 –

回答

5

在GCC的情況下,你可以使用typeof擴展,像這樣:

#define max(a,b) \ 
    ({ typeof (a) _a = (a); \ 
     typeof (b) _b = (b); \ 
     _a > _b ? _a : _b; }) 
+0

...和typeof(x ++)=(x ++)不會增加x兩次? – einpoklum

+0

'typeof'參數沒有得到評估 – qrdl

3

要將救災C有inline功能,因爲C99

+0

讚美主 – ApprenticeHacker

+1

不,讚美C標準委員會,他們配得上它。 –

+0

C11還增加了'_Generic',它允許您根據參數類型將宏分派給不同的實現函數。 (「overloading」) – pmdj