如何将参数绑定到C函数指针?

如何将参数绑定到C函数指针?,c,function,pointers,arguments,bind,C,Function,Pointers,Arguments,Bind,我做了一些关于如何在C语言中使用函数指针的研究,我试图做一些面向对象的模型。所以,为了对这样的事情建模,我被告知我必须向结构添加函数指针,这样它们就有点像“对象” 当我在C编程中很新的时候,这个问题看起来有点愚蠢(或者很容易回答),但是在互联网上,我发现了C++的例子,这不是我正在搜索的。 下面是我想展示的一个例子,以便您能够轻松理解我的问题: try.h文件: struct thing { void (*a)(int, int); }; void add(int x, int y); t

我做了一些关于如何在C语言中使用函数指针的研究,我试图做一些面向对象的模型。所以,为了对这样的事情建模,我被告知我必须向结构添加函数指针,这样它们就有点像“对象”

当我在C编程中很新的时候,这个问题看起来有点愚蠢(或者很容易回答),但是在互联网上,我发现了C++的例子,这不是我正在搜索的。 下面是我想展示的一个例子,以便您能够轻松理解我的问题:

try.h文件:

struct thing {
  void (*a)(int, int);
};
void add(int x, int y);
try.c文件:

#include <stdio.h>
#include <stdlib.h>
#include "try.h"

void add(int x, int y) {
  printf("x + y = %d\n", x+y);
}

int main(int argc, char* argv[]) {
  struct thing *p = (struct thing*) malloc(sizeof(struct thing));
  p->a = &add;
  (*p->a)(2, 3);
  free(p);
  p = NULL;
  return 0;
}
#包括
#包括
#包括“try.h”
无效添加(整数x,整数y){
printf(“x+y=%d\n”,x+y);
}
int main(int argc,char*argv[]){
struct thing*p=(struct thing*)malloc(sizeof(struct thing));
p->a=&add;
(*p->a)(2,3);
自由基(p);
p=零;
返回0;
}
例如,我希望始终使用
x=2
,因此
struct thing
中的函数指针将是这种指针:
void(*a)(int)
,而不再是
void(*a)(int,int)


将函数指针传递到结构(第
p->a=&add;
)时,如何绑定参数
x=2
?这在C语言中是可能的吗?在C++中,我看到了一些类似于<>代码> STD::BION/COD>,但是在C.

> P>中,我不能这样做。函数指针必须具有与它指向的函数相同的签名(类型和参数),所以不能像这样做。 您可以将绑定和调用包装到另外两个函数中:

struct thing {
  void (*a)(int, int);
  int x;
};
...
void bind1st( struct thing *p, int arg )
{
  p->x = arg;
}

void call( struct thing *p, int arg )
{
  p->a( p->x, arg );
}

您可能想尝试一下,但这应该可以让您开始了。

我也遇到过类似的问题,我使用了以下方法来解决,使用gcc编译它可以工作,使用clang编译它不工作

#include <stdio.h>

typedef int (*add_t) (int);

add_t add2(int x) {
  int add1(int y) {
    return x + y; 
  }
  return add1;
}

int main() {

  //add2(2);
  printf("%d\n", add2(2)(3));
}

#包括
类型定义int(*添加)(int);
添加地址2(整数x){
内部地址1(内部地址y){
返回x+y;
}
返回add1;
}
int main(){
//增补2(2);
printf(“%d\n”,add2(2)(3));
}

我认为这是最好的解决方案


typedef void(*call_type)();
call_type bind(void (*f)(int,int), int a, int b) {
    void call()  {
        f(a,b);
    }

    return &call;
}

void f(int a, int b){
    printf("%d, %d", a, b);
}

int main(){
    call_type c = bind(f, 5, 4);

    c();
}



一种还没有人讨论过的方法是使用一些JIT逻辑(我现在不提供一个工作示例,因为我还没有尝试过它,但我会在某个时候将它用于RPC库)。严格来说,这不是一种C语言功能,它只在CPU/MCU体系结构上可行,在这种体系结构中,您可以写入可执行内存段(在x86_64、x86、某些ARMs等上可能)

其原理实际上只是动态构造一个函数,以类似python定义动态嵌套函数的方式调用包装函数


您可以使用一些库:libgccjit、libjit、gnu ligthning、llvm等。

AFAIK在标准C中没有简单的方法可以做到这一点。函数指针只是要调用的函数的地址,没有奇妙的魔力。如果要绑定参数,必须显式编写一个函数,使用要修复的参数调用目标函数,并使用指向此新函数的指针。这是其他语言对闭包所做的。C没有它们(除了我认为GCC可以提供它们作为扩展)。应该可以了,谢谢。它有点不漂亮,但至少它满足了我的需求。我想到了一个堆栈,例如,
voidadd(Stack*st,Object*obj){obj->prev=st->last;st->last=obj;}
。因此,在基本上是结构的
堆栈中,我必须定义函数
void(*add)(堆栈,对象)
。我试图避免堆栈的重复,但这似乎是不可能的。只需添加一件事:不应该
p->a(p->x,arg)be
(*p->a)(p->x,arg)?在这种情况下,它可以使代码读得更好,但不是必需的;如果
foo
是函数指针,则可以使用
foo()
(*foo)(
)调用函数。嵌套函数不是任何标准的一部分。请指定您正在使用的编译器扩展,以及…它没有编译,因为它不是C,它是编译器扩展。还要注意,在内部函数中使用局部变量可能不安全(通常,只有静态变量是可访问的)