可以用C语言修改函数指针吗?

Posted

技术标签:

【中文标题】可以用C语言修改函数指针吗?【英文标题】:Is that possible to modify a function pointer in C language? 【发布时间】:2021-10-29 09:52:49 【问题描述】:

我现在有一个函数A(int num)。我想得到另一个函数B(int num),它在执行A(num)之前运行另一个函数C()。我打算写的是这样的

typedef void (*function_type)(int); 

function_type attachToFunction(function_type original, void (*additional_function)(void))

    /* return a function_type which first runs additional_function, and then runs original(int) */

但是,我不知道我应该如何完成该功能或是否有可能。

我同时使用 C 和 C++,所以只要函数声明不变,C++ 实现也是可以接受的。

【问题讨论】:

看起来你想要一个闭包。你能做的最好的是将信息存储在一个结构中,然后调用一个将结构作为参数的函数,从该结构中获取函数指针。在 C++ 中,您可以使用类并将调用作为方法。 正如 Jarod42 和 Tom 提到的那样,以 function_type 作为返回类型,它不能像捕获 lambda 那样携带任何其他信息。 example 您需要澄清这是 C 还是 C++,因为在这种情况下,答案可能因语言而异。 这听起来像是一个非常确定的“XY”问题。你认为创建一个新的函数类型是你试图解决的实际问题的正确解决方案,但你不能让它工作。与其问如何解决问题的错误解决方案,不如问解决实际问题的最佳解决方案。 通常在 C 中,这样的函数指针都包含一个 void* 参数用于关联数据。在 C++ 中,您可以将代码和数据打包到一个类中,这样就不需要了。 【参考方案1】:

不是用干净的方式。

您可能会使用 global,因为您无法使用该接口捕获参数:

typedef void (*function_type)(int); 

static function_type g_original = 0;
static void (*g_additional_function)() = 0;

void my_function(int n)

    if (g_additional_function) g_additional_function();
    if (g_original ) g_original(n);


function_type attachToFunction(function_type original,
                               void (*additional_function)(void))

    g_original = original;
    g_additional_function = additional_function

    return my_function;

由于是全局的,您一次只能拥有一个“附加”功能。

在 C++ 中,您可以通过模板“捕获”函数指针。 这些参数应该是编译时的

template <function_type f, void (*g)()>
void funcT(int n)

    g();
    f(n);

用法类似于

void C();
void A(int b);

void (*B)(int) = &funcT<&A, &C>;

【讨论】:

Gobal 变量不应被视为“万能的灵丹妙药”,也不应建议 imo 初学者使用。

以上是关于可以用C语言修改函数指针吗?的主要内容,如果未能解决你的问题,请参考以下文章

c语言 怎么解决调用函数导致的原数组改变

c语言 结构体的指针作为函数参数问题

go语言中指针的使用场景?

C语言指针变量的赋值和做函数的参数

C语言函数如何return数组?

c语言如何给指针参数赋值为null?