首页 > 解决方案 > 可以用C语言修改函数指针吗?

问题描述

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

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++c

解决方案


不是用干净的方式。

您可能会使用 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>;

推荐阅读