ANSI C -函数作为其他函数的参数

55ooxyrt  于 2023-03-22  发布在  其他
关注(0)|答案(3)|浏览(139)

我有这些原型:

int *my_func(int x, void (*other_func)(int a, int b));

int func2(int val1, int val2);

假设有一个函数与之匹配。
如果我真的想调用my_func,我该怎么做?我已经尝试了以下方法,但没有成功:

my_func(1,func2);

下面是错误:

warning: passing argument 2 of ‘my_func’ from incompatible pointer type
jecbmhm3

jecbmhm31#

这是因为函数原型不匹配:

void (*other_func)(void *a, int *b)

不同于:

int func2(int val1, int val2);

一个需要一个void*int*,而另一个需要两个int
编辑:
返回类型也不匹配。
编辑2:

**因为你已经修复了这两个错误,所以这个答案是断章取义的。**我刚刚用这两个修复测试了它,它编译:

int *my_func(int x, void (*other_func)(int a, int b)){
    return 0;
}
void func2(int val1, int val2){
    printf("blah");
}

int main(){
    my_func(1,func2);

    return 0;
}
tjvv9vkg

tjvv9vkg2#

您的原始代码将void*作为所传递函数的第一个参数,并将int作为返回类型,这导致了您的问题:

int *my_func(int x, void (*other_func)(void * a, int b)) { return 0;}
int func2(int val1, int val2) {}
int main (void) {
    my_func (42, func2);
    return 0;
}

通过以下编辑,将其更改为int并返回void,没有问题:

int my_func(int x, void (*other_func)(int a, int b)) { return 0;}
void func2(int val1, int val2) {}
int main (void) {
    my_func (42, func2);
    return 0;
}

编译前者可获得:

warning: passing argument 2 of 'my_func' from incompatible pointer type

编译后一种方法不会给您任何错误或警告,并且目标文件创建得很好。

lskq00tm

lskq00tm3#

通常(1)(2)我们使用“typedef”来确保我们拥有的函数类型与其他函数的参数类型相匹配。

typedef void (*pt2Func)(void *, int *);

int *my_func(int x, pt2Func other_func);

pt2Func func3;

int main(void){
    my_func(1,func3);
}

意思和

int *my_func(int x, void (*other_func)(void *a, int *b));

void func3(void *val1, int *val2);

int main(void){
    my_func(1,func3);
}

相关问题