Это называется операторным выражением и создает «лямбду» (или вложенную функцию ) и возвращает на нее указатель. Это GNU C -specifi 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 ++ вы можете сделать что-то похожее на это и иметь переносимый код.