En una pieza generada de código c encontré algo como esto (editado):
#include int main() { (void) ( { int i = 1; int y = 2; printf("%d %d\n", i,y); } ); return 0; }
Creo que nunca he visto el constructo (void) ( { CODE } )
antes, ni soy capaz de averiguar cuál podría ser el propósito.
Entonces, ¿qué hace esta construcción?
({ })
es una extensión de gcc
llamada expresión de statement .
http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html
Una expresión de statement produce un valor y la (void)
probablemente esté aquí para eliminar la advertencia del comstackdor o para hacer explícito que el valor de la expresión de la statement no se usa.
Ahora (void) ({ })
es lo mismo que una simple statement compuesta {}
y no tiene sentido usarla.
Una aplicación de ({ })
es la capacidad de reemplazar expresiones con bloques de código. De esta manera se pueden incrustar macros muy complejas en las expresiones.
#define myfunc() { } // can be a typical way to automatize coding. eg myfunc(x,y,z); myfunc(y,x,z); myfunc(x,z,y); // would work to eg. unroll a loop int a = myfunc()*123; // but this wouldn't work
En lugar
#define myfunc(a,b,c) ({printf(a#b#c);}) int a= myfunc(a,b,c) * 3; // would be legal