Cfunction指针不幸事故
好的,所以我正在尝试学习函数指针。 我有一个像这样的基本函数指针设置。
打印出链表的function:
void seq_print(Seq seq, void (* print_func)(void *)){ Node * p = seq->top; if(p == NULL){ printf("%s %c", "There is no data to print.", '\n'); return; } while(p != NULL){ print_func(p->data); p = p->next; } }
测试function:
seq_print(s, printFunc(1));
我收到此错误:
seq.h:113:32: error: expected declaration specifiers or '...' before '(' token extern void seq_print(Seq seq, (void *) print_func(void *));
我真的不确定该怎么做,任何见解都会有所帮助。
你有两个错误:
首先,在错误消息中注意声明:在你的头文件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 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 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); }
现在检查codepade输出:
In g() In f() i = 10
编辑:根据评论添加。
但是,如果它像
void (*f) (void *)
那么如何将值传递给它呢?
从main()中调用函数(在我的示例中= my_g2
),您需要传递您想要调用的函数指针(在我的示例中为f()
)来自您在main中调用的函数(即my_g2
)。
你想从my_g2()
调用f()
my_g2()
我们总是在函数调用时将参数传递给函数。 因此,如果要将参数传递给f()
函数,则必须在my_g2()
调用它时my_g2()
。
一个如下调用表达式(阅读评论):
seq_print(s, printFunc(1)); ^ // first printFunc(1) will be called then seq_prints pass returned value from printFunc(1)
是错误的,因为如果这样做,将使用函数printFunc(1)
第二个参数值=返回值调用printFunc(1)
。
要传递void指针,我的以下代码可能会帮助您进一步:
#include 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
错误消息中引用的前向声明中存在拼写错误。 它需要匹配您发布的代码片段,参数声明为void (* print_func)(void *)
。
看起来您的标题有拼写错误。 声明应该是
extern void seq_print(Seq seq, void (*print_func)(void *));
(void *)print_func(void *)
不是有效的函数指针声明。 要声明一个接受void指针并且不返回值的函数print_func,请使用void (*print_func)(void *)
编辑:省略(* print_func)周围的parens会创建一个函数指针但是对于返回指针的函数