这是GCC的一个扩展功能。逗号运算符无法使用:
// C89, doesn't work...
#define max(a,b) \
(typeof (a) _a = (a), \
typeof (b) _b = (b), \
(_a > _b ? _a : _b))
逗号运算符仅适用于表达式,
typeof(a) _a = (a);
是一个声明,而不是表达式。没有使用GCC扩展或C11(具有
_Generic
)几乎不可能编写等效的宏。请注意,
typeof
也是GCC扩展,因此除非您还消除
typeof
,否则通过消除
({...})
无法获得任何可移植性。
这是C11版本,与之相比非常冗长(仅处理两种类型!)。 C11甚至还没有得到支持,祝你好运尝试找到编译器来测试它:
// C11
static inline int maxi(int x, int y) { return x > y ? x : y; }
static inline long maxl(long x, long y) { return x > y ? x : y; }
long: maxl(x,y), \
int:_Generic((y), \
int: maxi(x,y), \
long: maxl(x,y)))
在可移植的C99中,你可以编写一个宏或内联函数来实现相同的效果,
但是每个宏只能适用于一种类型。
// C99
static inline int maxi(int x, int y) { return x > y ? x : y; }
在C89/C90中,我想不到任何方法来编写宏,使其不会评估
x
或
y
两次。
({...})
是GCC扩展而不是C语言的一部分。在我看来。 - Jack