C 指向一个函数的指针,该函数将指向另一个函数的指针作为参数

C 指向一个函数的指针,该函数将指向另一个函数的指针作为参数,c,function,pointers,functor,C,Function,Pointers,Functor,这应该是一个简单的问题,但我可能无法正确地表达它,或者我可能因为缺乏使用C语言的经验而试图挑战C语言的原则 我所要做的就是,给定一个指向函数的指针,将其封装在另一个函数中,该函数将指向函数的指针作为参数,并将其作为后面的指针。更好的代码: void do_nothing_1() {} void do_nothing_2() {} void wrapper(void(*f)()) { f(); } int main() { // the following will call the

这应该是一个简单的问题,但我可能无法正确地表达它,或者我可能因为缺乏使用C语言的经验而试图挑战C语言的原则

我所要做的就是,给定一个指向函数的指针,将其封装在另一个函数中,该函数将指向函数的指针作为参数,并将其作为后面的指针。更好的代码:

void do_nothing_1() {}
void do_nothing_2() {}

void wrapper(void(*f)()) { f(); }

int main() {

    // the following will call the function
    // but i just want a pointer of whats being called
    funcion_pointer_1 = wrapper(do_nothing_1);
    funcion_pointer_2 = wrapper(do_nothing_2);

    return 0;
}
我事先道歉,如果这个问题没有任何意义,请帮助我澄清它,而不是简单地否决它

编辑:由于需求的模糊性,很难获得想要的结果,因此我将更具体地说明我在寻找什么

在结构中,我有一个指向函数的指针:

struct my_struct {
    int (* run)(void);
}
我想做的是修改该函数,这就是我使用包装器的原因。例如,如果foo返回void,则将其更改为int。另外,在执行foo之前运行一些代码:

int wrapper(void (*foo)()) {

    // exec some stuff here

    foo();

    return 0;
}

最后,我想要的是,当我从我的结构中执行与*run指针对应的函数时,在执行run()之前执行一些东西,并更改返回类型。

在使用正确的语法时,使用typedefs可以使事情更清楚。不仅仅是为你自己编写代码,也为任何需要维护它的人,或者只是想弄清楚它在做什么

您需要一个指向以另一个函数指针作为参数的函数的函数指针。从参数开始,一个没有参数且没有返回值的函数:

typedef void (*void_handler_t)( void);
typedef void (*wrapper_handler_t)( void_handler void_fn);
现在是包装器函数指针,它接受函数指针参数,没有返回值:

typedef void (*void_handler_t)( void);
typedef void (*wrapper_handler_t)( void_handler void_fn);
以及守则:

void foo( void) {}
void wrapper( void_handler_t wrapped_fn)
{
    wrapped_fn();
}

int main( int argc, char *argv[])
{
    wrapper_handler_t function_pointer;

    function_pointer = &wrapper;
    function_pointer( &foo);

    return 0;
}

在使用正确的语法时,使用typedef使事情更清楚是很有帮助的。不仅仅是为你自己编写代码,也为任何需要维护它的人,或者只是想弄清楚它在做什么

您需要一个指向以另一个函数指针作为参数的函数的函数指针。从参数开始,一个没有参数且没有返回值的函数:

typedef void (*void_handler_t)( void);
typedef void (*wrapper_handler_t)( void_handler void_fn);
现在是包装器函数指针,它接受函数指针参数,没有返回值:

typedef void (*void_handler_t)( void);
typedef void (*wrapper_handler_t)( void_handler void_fn);
以及守则:

void foo( void) {}
void wrapper( void_handler_t wrapped_fn)
{
    wrapped_fn();
}

int main( int argc, char *argv[])
{
    wrapper_handler_t function_pointer;

    function_pointer = &wrapper;
    function_pointer( &foo);

    return 0;
}

你想要一个指向
wrapper
的函数指针吗?更准确地说,指向wrapper(foo)你能改变你的代码,这样就没有那么多的
foo
了——阴影会使事情复杂化。
wrapper(foo)
不是一个函数,所以你不能得到指向它的函数指针。你在找吗?如果是这样的话,考虑一个函数指针,比如,函数指针指向“代码>包装器< /代码>?更确切地说,对于包装器(FO),你可以改变你的代码,所以没有太多的代码< Foo> S——阴影会使事情变得复杂。<代码>包装器(FO)< /C>不是一个函数,所以你不能得到一个函数指针。你在寻找吗?”如果是这样的话,考虑一下。例如,关于语法和TyPulf的伟大技巧,我会赞成的,谢谢。我不确定这是否符合我的要求。是否有任何方法可以执行以下操作:函数\指针=&wrapper(&foo);函数_pointer();对于不透明数据以外的任何数据,typedef只会导致homocide@tbert你对typedef有什么意见?这被认为是不好的做法吗?@omtinez必须解构所有结构都被称为foo_t的代码,这导致无法在一个文件之外使用数据结构,而不必对命名方案进行鸡奸,等等。;基本上,随着它们的不断变化,清晰度的丧失overuse@tbert:我不太清楚
struct foo
如何比
foo\t
更清晰。我不喜欢用typedef指针指向其他类型的人,但我认为这对函数指针很有意义,特别是当这些指针作为其他结构中的元素或其他函数的参数时。关于语法和typedef的好提示,我将对此投赞成票,谢谢。我不确定这是否符合我的要求。是否有任何方法可以执行以下操作:函数\指针=&wrapper(&foo);函数_pointer();对于不透明数据以外的任何数据,typedef只会导致homocide@tbert你对typedef有什么意见?这被认为是不好的做法吗?@omtinez必须解构所有结构都被称为foo_t的代码,这导致无法在一个文件之外使用数据结构,而不必对命名方案进行鸡奸,等等。;基本上,随着它们的不断变化,清晰度的丧失overuse@tbert:我不太清楚
struct foo
如何比
foo\t
更清晰。我不喜欢用typedef指针指向其他类型的人,但我认为这对函数指针很有意义,特别是当这些指针作为其他结构中的元素或其他函数的参数时。