gpt4 book ai didi

c - 如何创建一个返回另一个函数的函数,并在 C 中隐式包含给定的参数?

转载 作者:行者123 更新时间:2023-12-02 09:06:27 25 4
gpt4 key购买 nike

我想要一个函数返回一个不带参数调用的函数,即使原始函数必须参数调用。该参数被传递给第一个函数,并且每次调用返回的函数时都会隐式使用该参数。

我知道 C 中的函数指针,但我不知道它们是否可以以这种方式使用。我知道如何在 python 中执行此操作,如以下示例代码所示:

def foo(some_argument):
print(some_argument)

def register_callback(function, argument):
def new_function():
function(argument)

return new_function

bar = register_callback(foo,"bar")

bar()

据我所知,这种方式在 C 中是不可能的,因为我们不能嵌套函数定义。这是否可能?如果可以,正确的方法是什么?

最佳答案

在 C 中你能做的就是创建一个包含函数指针和要传递的参数的记录(一个struct),然后使用该记录作为调用的“事物”,执行实际调用的包装函数的协助。

#include <stdio.h>


typedef int SomeType; // Sample type for demonstration.


// Define a record to hold a function pointer and the argument we want to pass.
typedef struct
{
void (*Function)(SomeType); // Function to call.
SomeType Argument; // Argument to pass.
} Closure;


// Define some sample functions.
static void A(SomeType x) { printf("Called %s(%d).\n", __func__, x); }
static void B(SomeType x) { printf("Called %s(%d).\n", __func__, x); }


// Define a function that returns a closure.
static Closure foo(int Which, SomeType x)
{
return (Closure) { .Function = Which & 1 ? B : A, .Argument = x };
}


// Define a function to call a closure.
static void Call(Closure C) { C.Function(C.Argument); }


int main(void)
{
Closure a = foo(0, 34);
Closure b = foo(1, 79);
Call(a);
Call(b);
}

输出:

Called A(34).Called B(79).

关于c - 如何创建一个返回另一个函数的函数,并在 C 中隐式包含给定的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57791597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com