Questa si chiama espressione di istruzione e crea una "lambda" (o funzione nidificata ) e restituisce un puntatore ad essa. È specifico per GNU C.
La macro si espande in:
int (*max)(int, int) = ({ int _ (int x, int y) { return x > y ? x : y; } _; })
Alla _
fine è come a return
.
Il carattere di sottolineatura è in realtà il nome della funzione creata e "restituita". Viene utilizzato perché è un identificatore non utilizzato (per una buona ragione; _
è probabilmente l'identificatore meno descrittivo possibile).
Il motivo per cui viene utilizzata _
l'espressione dell'istruzione non sarà quindi definito dopo la chiusura dell'ambito dell'espressione dell'istruzione.
Quindi, passando attraverso la macro:
#define lambda(ret_type, _body) ({ ret_type _ _body _; })
ret_type
è il tipo di ritorno del "lambda". _
è il nome della funzione utilizzata al suo interno perché è un nome identificativo non comune. _body
consiste negli argomenti e nel corpo della funzione. Il finale _
"restituisce" il "lambda".
Questo codice si trova in Let's Destroy C (che è un nome appropriato). Non dovresti usarlo. Farà funzionare il tuo codice solo su compilatori che supportano le estensioni GNU C. Invece, basta scrivere una funzione o una macro.
Se usi molto costrutti come questo o vuoi più funzionalità, ti suggerisco di usare C ++. Con C ++ puoi fare qualcosa di simile a questo e avere un codice portatile.
gcc -E
) per vedere cosa fa?