范围可以用括号括起来并在C中返回一个值吗?

我在Mac OS X上查找了MIN的定义,发现了这个:

 #define MIN(A,B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __a : __b; }) 

起初并不是那么明显,但是当它扩展时,它会变成对我来说非常奇怪的东西:

 int a = 1, b = 2; // int min = MIN(a, b); int min = ({ int __a = (a); int __b = (b); __a < __b ? __a : __b; }); 

实际上,这是一个包含在表达式中的范围,该表达式“返回”最后一个表达式的值。 它似乎工作,至少与clang,在范围内几乎任意的代码:

 int a = ({ time_t x = time(NULL); if (x % 3 == 1) x++; x % 10; }); 

我以前从未见过这个,我想知道它是不是标准。 我知道Visual Studio不会接受它,但是再一次,Visual Studio仍然坚持使用C89,所以这不是很有说服力。

这是标准C的GCC扩展,称为语句表达式 。 是的,如果您只需要支持GNU编译器(并且它是跨平台的),您可以使用它。 如果您需要坚持使用标准C,则不会使用该表示法。