2010-12-17 14 views
7

Duplicar posibles:
in what versions of c is a block inside parenthesis used to return a value valid?¿Por qué esta C válida? --- ({123;}) evalúa a 123

La siguiente es una versión de tipo seguro de un típico macro MAX (esto funciona en gcc 4.4.5):

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

Aquí, vemos que esta expresión, max (a, b) devuelve el resultado de la expresión

_a > _b ? _a : _b; 

aunque esta expresión está en un bloque. Así, investigué y descubrí que esto es válido C:

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

Puede alguien explicar por qué esto es la gramática válida y cuál es el verdadero comportamiento de las declaraciones ({}) es? Además, notará que {123;} no es una expresión válida, pero solo ({123;}) es.

+3

Dupes: [Oct 2009] -parenthesis-used-to-return-a-value-valid) [mayo de 2010] (http://stackoverflow.com/questions/2892981/weird-initialization-in-c) [ene 2010] (http: // stackoverflow .com/questions/2075930/more-information-on-in-c) –

Respuesta

16

No es válido C99 o C89 ni C++. Es la extensión de gcc, llamada "expresión de declaración". Para validar un código C con gcc, agregue las opciones -ansi -pedantic. También opciones útiles son -W -Wall -Wextra

Docs para las expresiones de los estados están aquí http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html

Esta extensión de GNU es ampliamente utilizado en el código GNU y Linux, por lo que es compatible no sólo por GCC, sino también en los compiladores modernos como el compilador Intel C++ Sun Studio LLVM + clang ...

+1

Actualmente (gcc 4.4.5), para C, '-ansi' es equivalente a '-std = c89' (y' -std = C++ 98' para C++). Algunas otras opciones útiles son '-std = c99',' -std = gnu89', '-std = gnu99',' -std = C++ 0x', '-std = gnu ++ 0x'. – pmg

+0

@pmg, si lo sabe, ¿se incluirá la "declaración exprs" en algún estándar futuro? – osgx

+2

Hmm ... este [PDF en el sitio abierto-estándar] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1229.pdf) insinúa que las "expresiones de declaración" se convierten en estándar algun tiempo. – pmg

Cuestiones relacionadas