lambda宏如何创建lambda?

问题描述 投票:19回答:2

我在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内部的下划线是什么,它如何返回函数指针?

c gcc lambda macros function-pointers
2个回答
10
投票

使用此宏,

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中进行比较。


7
投票

这称为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 ++,您可以执行类似于具有可移植代码的操作。

© www.soinside.com 2019 - 2024. All rights reserved.