Isso é chamado de expressão de instrução e cria uma "lambda" (ou função aninhada ) e retorna um ponteiro para ela. É específico do GNU C.
A macro se expande para:
int (*max)(int, int) = ({ int _ (int x, int y) { return x > y ? x : y; } _; })
O _
no final é como a return
.
O sublinhado é realmente o nome da função criada e "retornada". É usado porque é um identificador pouco utilizado (por boas razões; _
é possivelmente o identificador menos descritivo possível).
O motivo pelo qual a expressão de instrução é usada é que _
não será definido após a saída do escopo da expressão de instrução.
Então, passando pela macro:
#define lambda(ret_type, _body) ({ ret_type _ _body _; })
ret_type
é o tipo de retorno do "lambda". _
é o nome da função usada nela porque é um nome de identificador incomum. _body
consiste nos argumentos e corpo da função. A trilha_
"retorna" o "lambda".
Este código é encontrado em Let's Destroy C (que é um nome apropriado). Você não deveria usá-lo. Isso fará com que seu código funcione apenas em compiladores que suportam extensões GNU C. Em vez disso, basta escrever uma função ou macro.
Se você usa muito essas construções ou deseja mais recursos, sugiro usar C ++. Com o C ++, você pode fazer algo semelhante a isso e ter código portátil.
gcc -E
) para ver o que ela faz?