9

我查找了MINMac OS X 上的定义,发现:

#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 卡住了,所以这不是很能说明问题。

4

1 回答 1

9

这是标准 C 的 GCC 扩展,称为Statement Expressions。是的,如果您只需要支持 GNU 编译器(并且它是跨平台的),您就可以使用它。如果您需要坚持标准 C,则不会使用该符号。

于 2013-05-15T17:14:42.080 回答