2010-12-17 12 views
7

可能な重複に評価:
これはなぜ有効なCですか? ---({123;})123

in what versions of c is a block inside parenthesis used to return a value valid?

以下(これはGCCで動作する典型的なMAXマクロのタイプセーフなバージョンであります4.4.5):ここで

#define max(a,b) \ 
({ __typeof__ (a) _a = (a); \ 
    __typeof__ (b) _b = (b); \ 
_a > _b ? _a : _b; }) 

は、我々はこの式は、MAXは(a、b)は、式の結果を返すことがわかり

この式はブロック内にあるにもかかわらず、
_a > _b ? _a : _b; 

。だから、私が調査し、これが有効なCであることがわかった:これが有効な文法と何({文})の真の挙動がある理由

int a = ({123;}); // a is 123 

誰かが説明できますか?また、{123;}は有効な式ではなく({123;})のみであることがわかります。

+3

Dupes:[2009年10月](http://stackoverflow.com/questions/1635549/in-what-versions-of-c-is-a-block-inside - 括弧で囲まれた - 戻り値 - 有効 - 有効)[2010年5月](http://stackoverflow.com/questions/2892981/weird-initialization-in-c)[1月2010](http:// stackoverflow .com/questions/2075930/more-information-on-c) –

答えて

16

それは有効なC99やC89やC++ではありません。 gccの拡張で、 "Statement expression"と呼ばれています。 gccを使用してCコードを検証する場合は、オプション-ansi -pedanticを追加します。また、便利なオプションは、ステートメント式の-W -Wall -Wextra

ドキュメントがここhttp://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html

あるこのGNU拡張が広くGNUコードとLinuxで使用されているので、GCCによって、だけでなく、インテルC++コンパイラーのような最近のコンパイラではないだけでサポートされています、サンスタジオ、LLVM +の打ち鳴らす、...

+1

現在、(gcc 4.4.5)、C、 '-ansi' '-std = c89'(C++では' -std = C++ 98')に相当します。その他の便利なオプションは '-std = c99'、' -std = gnu89'、 '-std = gnu99'、' -std = C++ 0x'、 '-std = gnu ++ 0x'です。 – pmg

+0

@pmgもしあなたが知っていれば、来るべき規格には "statement exprs"が含まれていますか? – osgx

+2

うーん...この[オープン-STDサイト上のPDF]は(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1229.pdf)標準になるための「文の表現」ヒントいつか – pmg

関連する問題