我在GitHub上找到了这段代码,但不太了解:
#define lambda(ret_type, _body) ({ ret_type _ _body _; })
然后:
int (*max)(int, int) = lambda(int,
(int x, int y) {
return x > y ? x : y;
});
int max_value = max(1, 2);
// max_value is 2
#define
内部的下划线是什么,它如何返回函数指针?
使用此宏,
int (*max)(int, int) = lambda(int,
(int x, int y) {
return x > y ? x : y;
});
扩展到:
int (*max)(int, int) = ({
int _ (int x, int y) { return x > y ? x : y; }
_;
});
在花括号中,它使用GCC的Nested Functions创建执行所需操作的功能。在内部范围内,它的名称为_
。
然后,如interjay所述,使用了GCC的Statement Expressions。有效地,功能_
被分配给指针max
。
如果不使用这样的宏,则可以用不同的方式编写并用作:
int val1 = 4;
int val2 = -30;
int perform_operation(int (*op)(int, int)) {
int new_val = op(val1, val2);
val1 = val2;
val2 = new_val;
return new_val;
}
int enclosing_function (void) {
// Create max "lambda"
int (*max)(int, int);
{
// Curly braces limit the scope of _
int _ (int x, int y) { return x > y ? x : y; }
max = _;
}
return perform_operation(max);
}
这三种方法可以在this code example中进行比较。
这称为statement expression,并创建一个“ lambda”(或nested function)并返回指向它的指针。它是特定于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
是“ lambda”的返回类型。 _
是其中使用的函数的名称,因为它是一个不常见的标识符名称。 _body
由参数和函数主体组成。尾随的_
“返回”“ lambda”。
此代码位于Let's Destroy C(这是一个适当的名称)。你不应该使用它。这将使您的代码仅在支持GNU C扩展的编译器上工作。相反,只需编写一个函数或宏。
如果您经常使用这种构造或想要更多功能,建议使用C ++。使用C ++,您可以执行类似于和具有可移植代码的操作。