我已经做了一些关于如何在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;
}
作为示例,我希望始终x = 2
,因此struct thing
中的函数指针将是这种指针:void (*a)(int)
而不是void (*a)(int, int)
。< / p>
如何在将函数指针传递给struct(行x = 2
)时绑定参数p->a = &add;
?这在C中甚至可能吗?在C ++中,我看到过类似std::bind
的内容,但我无法在C中执行此操作。
答案 0 :(得分:2)
函数指针必须与它指向的函数具有相同的签名(类型和参数),所以你不能真的这样做。
你可以用另外几个函数包装bind和call:
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 );
}
你会想要尝试一下,但这应该让你开始。
答案 1 :(得分:0)
我也遇到过类似的问题,并且我使用以下方法解决了问题,使用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));
}
答案 2 :(得分:0)
我认为这是最好的解决方案。
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();
}
答案 3 :(得分:0)
一种还没有人讨论过的方法是使用一些 JIT 逻辑(我现在不会提供一个工作示例,因为我还没有尝试过,但我会在某个时间将它用于 RPC图书馆)。严格来说,这并不是 C 语言的特性,它只适用于可以写入可执行内存段的 CPU/MCU 架构(在 x86_64、x86、某些 ARM 等上是可能的)。
原理其实只是动态构造一个函数,它会以类似于python定义动态嵌套函数的方式调用包装函数。
你可以使用的一些库:libgccjit、libjit、gnu-ligthning、llvm 等