Esto se llama una expresión de instrucción y crea una "lambda" (o función anidada ) y le devuelve un puntero. Es GNU C específico.
La macro se expande a:
int (*max)(int, int) = ({ int _ (int x, int y) { return x > y ? x : y; } _; })
Al _
final es como a return
.
El guión bajo es en realidad el nombre de la función que se crea y "devuelve". Se usa porque es un identificador de uso poco frecuente (por una buena razón; _
posiblemente sea el identificador menos descriptivo posible).
La razón por la que se usa la expresión de la declaración es _
que no se definirá después de que salga el alcance de la expresión de la declaración.
Entonces, pasando por la macro:
#define lambda(ret_type, _body) ({ ret_type _ _body _; })
ret_type
es el tipo de retorno de la "lambda". _
es el nombre de la función utilizada en su interior porque es un nombre de identificador poco común._body
consiste en los argumentos y el cuerpo de la función. El final _
"devuelve" la "lambda".
Este código se encuentra en Let's Destroy C (que es un nombre apropiado). No deberías usarlo. Hará que su código funcione solo en compiladores que admitan extensiones GNU C. En cambio, solo escribe una función o macro.
Si usa muchas construcciones como esta o desea más funciones, sugiero usar C ++. Con C ++ puedes hacer algo similar a esto y tener un código portátil.
gcc -E
) para ver qué hace?