¿En qué versiones de C se usa un bloque entre paréntesis para devolver un valor válido?

Si lo hago:

int j = ({int x = 7; x+3;}); 

En i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5646) gcc comstack perfectamente. El bloque en cuestión ({int x = 7; x+3;}) devuelve el valor de la última instrucción como el valor del bloque. Si eliminas el paréntesis no se comstack. ¿Puedo esperar que esto funcione en la mayoría de los comstackdores de C?

Además, ¿cuál es el nombre de esta construcción? He tenido muchos problemas para buscarlo porque los motores de búsqueda no indexan () o {} y C es un término de búsqueda terrible. Tampoco he podido encontrar nada al respecto en ninguno de mis libros, probablemente porque no sé qué buscar.

Si eliminas el paréntesis no se comstack.

Sin los paréntesis, el comstackdor tratará esto como un bloque de inicialización agregado y fallará cuando vea la palabra clave int . No puede haber palabras clave en los bloques de inicialización.

6.7.8 Inicialización

11 El inicializador para un escalar será una expresión única, opcionalmente encerrada entre llaves. El valor inicial del objeto es el de la expresión (después de la conversión); se aplican las mismas restricciones de tipo y conversiones que para la asignación simple, considerando que el tipo de escalar es la versión no calificada de su tipo declarado.

6.2.5 tipos

21 Los tipos aritméticos y los tipos de punteros se denominan colectivamente tipos escalares. Los tipos de matriz y estructura se denominan colectivamente tipos agregados.


¿Puedo esperar que esto funcione en la mayoría de los comstackdores de c?

No. Parece una extensión GNU no estándar.

Además, ¿cuál es el nombre de esta construcción?

Me pregunto si hay alguna. En realidad, esto es similar a lo que suelen hacer las macros.

Es una extensión de GCC :

Una statement compuesta entre paréntesis puede aparecer como una expresión en GNU C. Esto le permite usar bucles, interruptores y variables locales dentro de una expresión.

Recuerde que una statement compuesta es una secuencia de declaraciones rodeadas por llaves; En esta construcción, los paréntesis van alrededor de las llaves. Por ejemplo:

  ({ int y = foo (); int z; if (y > 0) z = y; else z = - y; z; }) 

es una expresión válida (aunque ligeramente más compleja de lo necesario) para el valor absoluto de foo () .

Lo último en la statement compuesta debe ser una expresión seguida de un punto y coma; el valor de esta subexpresión sirve como el valor de toda la construcción. (Si usa algún otro tipo de statement en último lugar entre llaves, la construcción tiene el tipo void y, por lo tanto, no tiene ningún valor.) …

Puede esperar que funcione en la mayoría de las versiones de GCC.

Puede esperar que funcione casi en ninguna otra parte, es una extensión GCC.

La sección del manual de GCC que describe la característica se titula ‘Declaraciones y declaraciones en expresiones’:

Una statement compuesta entre paréntesis puede aparecer como una expresión en GNU C.

Más tarde dice:

Cualquier temporario creado dentro de una statement dentro de una expresión de statement será destruido al final de la statement. Esto hace que las expresiones de statement dentro de las macros sean ligeramente diferentes de las llamadas a funciones.

Entonces, ‘expresión de statement’ parece ser el nombre usado en la documentación.