2013-05-15 5 views
9

私は、Mac OS X上のMINの定義を見て、これが見つかりました:それは、最初はそれほど明らかではないが、それが膨張すると、それは私には非常に奇妙に見える何かに変身スコープをカッコで囲み、Cで値を返すことはできますか?

#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; 
}); 

これは、実際には、最後の式の値を「返す」式にラップされたスコープです。スコープ内のほとんど任意のコードと、少なくとも打ち鳴らすと、動作するようです:

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

    x % 10; 
}); 

私は前にこれを見たことがなかった、それが標準だ場合、私は思っていました。私はVisual Studioがそれを受け入れないという事実を知っていますが、Visual StudioはC89に固執しているので、それはあまり知られていません。

+0

これはあなたの質問に答えます:http://en.wikipedia.org/wiki/Blocks_(C_language_extension) – SomeWittyUsername

+7

@icepack、それはブロックではありません。ブロックはカッコ演算子で呼び出され、 '^'文字で始まる必要があります。 – zneak

+1

FWIW、[ISO 9899:1999](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf)で何も見つかりません。 (これはそこにないことを意味するわけではありませんが、明らかに私が明白な場所ではないと確信しています) – millimoose

答えて

9

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

+0

見つけた:http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.htmlありがとう。 – zneak

関連する問題