2010-12-17 4 views
7

Mögliche Duplizieren:
in what versions of c is a block inside parenthesis used to return a value valid?Warum ist das gültig C? --- ({123;}) den Wert 123

Das Folgende ist eine typsichere Version eines typischen MAX Makro (dies funktioniert auf gcc 4.4.5):

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

Hier sehen wir, dass dieser Ausdruck, max (a, b) gibt das Ergebnis des Ausdrucks

_a > _b ? _a : _b; 

obwohl dieser Ausdruck in einem Block ist. So untersuchte ich, und fand, dass diese gültig C:

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

Kann jemand erklären, warum diese gültige Grammatik ist und was das wahre Verhalten ({Anweisungen}) ist? Außerdem werden Sie feststellen, dass {123;} kein gültiger Ausdruck ist, sondern nur ({123;}).

+3

Dupes: [Okt 2009] (http://stackoverflow.com/questions/1635549/in-what-versions-of-c-is-a-block-inside -parenthesis-used-to-return-a-value-valid [Mai 2010] (http://stackoverflow.com/questions/2892981/weird-initialization-in-c) [Januar 2010] (http: // stackoverflow .com/questions/2075930/more-information-on-in-c) –

Antwort

16

Es ist kein gültiges C99 oder C89 noch C++. Es ist Gcc-Erweiterung, "Statement-Ausdruck" genannt. Um einen C-Code mit gcc zu validieren, fügen Sie die Optionen -ansi -pedantic hinzu. Auch nützliche Optionen sind -W -Wall -Wextra

Docs for-Anweisung Ausdrücke sind hier http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html

Diese Gnu Erweiterung ist in GNU-Code und Linux weit verbreitet, so wird nicht nur vom GCC, sondern auch in der modernen Compilern wie Intel C++ Compiler , Sun Studio, LLVM + Klang, ...

+1

Momentan (gcc 4.4.5), für C, '-ansi' entspricht -std = c89' (und '-std = C++ 98' für C++). Einige andere nützliche Optionen sind '-std = c99',' -std = gnu89', '-std = gnu99',' -std = C++ 0x', '-std = gnu ++ 0x'. – pmg

+0

@pmg, Wenn Sie wissen, wird die "Erklärung" in einigen kommenden Standard enthalten? – osgx

+2

Hmm ... das [PDF auf der offenen Seite] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1229.pdf) deutet darauf hin, dass "Statement-Ausdrücke" zum Standard werden irgendwann. – pmg

Verwandte Themen