2013-01-06 57 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