你有两个错误:
首先,注意错误信息中的声明:在你的头文件seq.h
中,函数声明是错误的!
extern void seq_print(Seq seq, (void *) print_func(void *));
// ^ ^ wrong = parenthesis return type
它应该是:
extern void seq_print(Seq seq, void (*print_func) (void *));
// ^ correct ^ = parenthesis function name
第二,在呼叫地点。
seq_print(s, printFunc(1));
// ^^^ you are calling function, and passes returned value
应该:
seq_print(s, printFunc);
// ^^^^^^^^^^ don't call pass function address
我的以下代码示例将帮助您更好地理解(阅读评论):
#include<stdio.h>
void my_g2(int i, (void*) f(int)); // Mistake: Notice () around void*
void f(int i){
printf("In f() i = %d\n", i);
}
int main(){
my_g2(10, f(1)); // wrong calling
return 0;
}
void my_g2(int i, void (*f)(int)){
printf("In g()\n");
f(i);
}
检查键盘以获取工作代码。您可以看到错误与您得到的类似:
Line 2: error: expected declaration specifiers or '...' before '(' token
In function 'main':
Line 8: error: too many arguments to function 'my_g2'
现在此代码的正确版本:
#include<stdio.h>
void my_g2(int i, void (*f)(int)); // Corrected declaration
void f(int i){
printf("In f() i = %d\n", i);
}
int main(){
my_g2(10, f); // corrected calling too
return 0;
}
void my_g2(int i, void (*f) (int)){
printf("In g()\n");
f(i);
}
现在检查代码板的输出:
In g()
In f() i = 10
编辑:在评论的基础上添加。
但是,如果void (*f) (void *)
我如何将值传递给它呢?
从 main() 中的调用函数(在我的示例中 = my_g2
),您需要f()
从您在 main 中调用的函数(即)传递您想要调用的函数指针(在我的示例中my_g2
)。
你想f()
从my_g2()
我们总是在函数调用时将参数传递给函数。因此,如果您想将参数传递给f()
函数,则必须在调用 this 时传递my_g2()
。
如下调用表达式(阅读评论):
seq_print(s, printFunc(1));
^ // first printFunc(1) will be called then seq_prints
pass returned value from printFunc(1)
是错误的,因为如果这样做,seq_print
将使用第二个参数 value = 从函数返回的值来调用printFunc(1)
。
要传递 void 指针,我的以下代码可能会进一步帮助您:
#include<stdio.h>
void my_g2(void* i, void (*f)(void*));
void f(void *i){
printf("In f(), i = %d\n", *(int*)i);
*(int*)i = 20;
}
int main(){
int i = 10;
my_g2(&i, f);
printf("Im main, i = %d", i);
return 0;
}
void my_g2(void* i, void (*f)(void*)){
printf("In g()\n");
f(i);
}
输出@codepade:
In g()
In f(), i = 10
Im main, i = 20