Это называется выражением оператора и создает «лямбду» (или вложенную функцию ) и возвращает на нее указатель. Это GNU C-специфично.
Макрос расширяется до:
int (*max)(int, int) = ({ int _ (int x, int y) { return x > y ? x : y; } _; })
_
конце это как return
.
Подчеркивание - это имя функции, которая создается и «возвращается». Он используется потому, что это редко используемый идентификатор (по уважительной причине; _
вполне возможно, наименее описательный идентификатор из возможных).
Причина, по которой выражение выражение используется так _
, не будет определена после выхода из области выражения выражения.
Итак, пройдемся по макросу:
#define lambda(ret_type, _body) ({ ret_type _ _body _; })
ret_type
тип возврата "лямбда". _
это имя функции, используемой внутри него, потому что это необычное имя идентификатора._body
состоит из аргументов и тела функции. Трейлинг _
«возвращает» «лямбду».
Этот код находится в Let's Destroy C (это подходящее имя). Вы не должны использовать это. Это заставит ваш код работать только на компиляторах, которые поддерживают расширения GNU C. Вместо этого просто напишите функцию или макрос.
Если вы часто используете подобные конструкции или хотите больше возможностей, я предлагаю использовать C ++. С C ++ вы можете сделать что-то похожее на это и иметь переносимый код.
gcc -E
), чтобы увидеть, что он делает?