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会创建一个函数指针但是对于返回指针的函数