Це називається виразом заяви і створює "лямбда" (або вкладену функцію ) і повертає на нього вказівник. Це специфічно для 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
), щоб побачити, що він робить?