3 ms·
#define lambda(ret_type, _body) ({ ret_type _ _body _; }) I found this one really fascinating, they're using both statement expression and nested functions. T
by PatrickMDev 7y ago
#define lambda(ret_type, _body) ({ ret_type _ _body _; })
I found this one really fascinating, they're using both statement expression and nested functions. Their (reformatted) example of:
int (*max)(int, int) =
lambda(int, (int x, int y) { return x > y ? x : y; });
macro-expands to
int (*max)(int, int) =
({ int _(int x, int y) { return x > y ? x : y;}; });
So they have a statement-expression with just one statement in it - the value of that statement is the value of the whole statement-expression. And the one statement inside the statement expression is a declaration of a nested function named _. Statement-expressions decay their return types, so that function gets converted to a function pointer. And thus your "lambda" is a pointer to a GCC nested function.
- nwellnhof 7y agoIt's slightly different. { ret_type _ _body _; } Notice the second underscore at the end? The compound statement contains a nested function definition followed by an expression statement which "returns" the function just defined. The function definition alone wouldn't work.