最大宏的安全解决方案?

时间:2013-01-06 07:46:02

标签: c macros

我们都知道这个着名的宏观例子:

#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

Effective C ++ 中,Scott Meyers使用inline函数为此提供了一个C ++解决方案。

21st Century C 中,我希望有一个类似的C解决方案,但遗憾的是它建议避免双重使用。这让我很伤心。 :'(

当然,人们总是可以用常规功能替换它。但我想知道是否有一个只有C的宏解决方案,这解决了双重使用问题。 任何可能的解决方案?

2 个答案:

答案 0 :(得分:5)

如果是GCC,您可以使用typeof扩展名,如下所示:

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

答案 1 :(得分:3)

从C99开始,C具有inline功能。