最大宏的安全解决方案?

App*_*ker 0 c macros

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

#define max(a,b) ((a) > (b) ? (a) : (b))
Run Code Online (Sandbox Code Playgroud)

而且,因为它使用ab两次,就当我们做这样的事情变得不准确:

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

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

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

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

qrd*_*rdl 5

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

#define max(a,b) \
    ({ typeof (a) _a = (a); \
        typeof (b) _b = (b); \
        _a > _b ? _a : _b; })
Run Code Online (Sandbox Code Playgroud)