我们都知道这个着名的宏观例子:
#define max(a,b) ((a) > (b) ? (a) : (b))
而且,由于它使用a
和b
两次,因此当我们执行以下操作时会变得不准确:
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的宏解决方案,这解决了双重使用问题。 任何可能的解决方案?
答案 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
功能。