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

これは、 Statement Expressionsと呼ばれる標準 C の GCC 拡張です。はい、GNU コンパイラのみをサポートする必要がある場合に使用できます (クロスプラットフォームです)。標準 C に固執する必要がある場合は、表記法を使用しません。

于 2013-05-15T17:14:42.080 に答える