2010-12-17 10 views
7

Powiel możliwe:
in what versions of c is a block inside parenthesis used to return a value valid?Dlaczego to jest prawidłowe C? --- ({123;}) ma wartość 123

Poniżej znajduje się bezpieczny typu wersja typowego MAX makro (to działa na gcc 4.4.5):

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

Tutaj widzimy, że to wyrażenie, max (a, b) zwraca wynik wyrażenia

_a > _b ? _a : _b; 

mimo że wyrażenie to znajduje się w bloku. Tak, ja zbadane i stwierdzono, że jest to ważny C:

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

Może ktoś wyjaśnić, dlaczego jest to ważne gramatyki i co prawda zachowanie ({instrukcje}) jest? Ponadto zauważysz, że {123;} nie jest prawidłowym wyrażeniem, ale tylko ({123;}).

+3

Powielania: [Paź 2009] (http://stackoverflow.com/questions/1635549/in-what-versions-of-c-is-a-block-inside -parenthesis-used-to-return-a-value-valid) [maj 2010] (http://stackoverflow.com/questions/2892981/weird-initialization-in-c) [Jan 2010] (http: // stackoverflow .com/questions/2075930/more-information-in-c) –

Odpowiedz

16

To nie jest poprawny C99 lub C89 ani C++. Jest to rozszerzenie gcc, zwane "wyrażeniem oświadczenia". Aby sprawdzić poprawność kodu C z gcc, dodaj opcje -ansi -pedantic. Również użyteczne opcje są -W -Wall -Wextra

Docs dla wyrażenia rachunku tutaj http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html

Ten gnu rozszerzeń jest szeroko stosowany w kodzie GNU i Linux, więc to jest obsługiwane nie tylko przez GCC, ale również w nowoczesnych kompilatorów jak Intel C++ , Sun Studio, LLVM + clang, ...

+1

Obecnie (gcc 4.4.5), dla C, '-ansi' jest odpowiednikiem '-std = c89' (i' -std = C++ 98' dla C++). Inne przydatne opcje to '-std = c99',' -std = gnu89', '-std = gnu99',' -std = C++ 0x', '-std = gnu ++ 0x'. – pmg

+0

@pmg, jeśli wiesz, czy "wyrażenie wygaśnie" będzie częścią jakiegoś nadchodzącego standardu? – osgx

+2

Hmm ... to [plik PDF na stronie open-std] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1229.pdf) podpowiedzi do "wyrażeń oświadczeń" stają się standardami czasami. – pmg

Powiązane problemy