Navegación por las fuentes del kernel de Linux que he encontrado some piece of code donde un bloque de instrucciones rodeadas por paréntesis se trata como una expresión a la Lisp (o ML), es decir, una expresión cuyo valor es el valor de la última declaración.¿Las sentencias compuestas (bloques) están rodeadas por expresiones parens en ANSI C?
Por ejemplo:
int a = ({
int i;
int t = 1;
for (i = 2; i<5; i++) {
t*=i;
}
t;
});
He estado buscando en la ANSI C grammar tratando de averiguar cómo esta pieza de código encajaría en el árbol de análisis, pero no he tenido éxito.
Entonces, ¿alguien sabe si este comportamiento es obligatorio por la norma o es solo una peculiaridad de GCC?
Actualización: He tratado con la bandera -pedantic y el compilador ahora me da una advertencia:
warning: ISO C forbids braced-groups within expressions
Puede suprimir la advertencia en GCC colocando '__extension__' antes del paréntesis de apertura. – Flimm