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

时间:2011-10-24 03:13:04

标签: c function-pointers ansi

我有这些原型:

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

3 个答案:

答案 0 :(得分:5)

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

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;
}

答案 1 :(得分:2)

原始代码的传递函数的第一个参数为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

编译后者不会给您带来任何错误或警告,并且可以很好地创建目标文件。

答案 2 :(得分:0)

通常(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);
}