0

我们都知道这个著名的宏示例:

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

而且,由于它使用aandb两次,所以当我们执行以下操作时它变得不准确:

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

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

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

当然,总是可以用常规函数替换它。但我想知道是否有一个仅限 C 的宏解决方案来解决双重使用问题。任何可能的解决方案?

4

2 回答 2

5

在 GCC 的情况下,您可以使用typeof扩展,如下所示:

#define max(a,b) \
    ({ typeof (a) _a = (a); \
        typeof (b) _b = (b); \
        _a > _b ? _a : _b; })
于 2013-01-06T08:25:40.343 回答
3

让你松了一口气,Cinline自 C99 起就有了功能。

于 2013-01-06T08:10:59.013 回答