2

好的,所以我正在尝试学习函数指针。我有一个像这样的基本函数指针设置。

打印出链表的功能:

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

测试功能:

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 *));

我真的不知道该怎么做,任何见解都会有所帮助。

4

3 回答 3

6

你有两个错误:

首先,注意错误信息中的声明:在你的头文件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
于 2013-10-11T04:31:57.530 回答
3

错误消息中引用的前向声明中有错字。它需要与您发布的代码片段相匹配,参数声明为void (* print_func)(void *).

于 2013-10-11T04:18:07.303 回答
2

看起来你的标题有错字。声明应该是

extern void seq_print(Seq seq, void (*print_func)(void *));

(void *)print_func(void *)不是有效的函数指针声明。要声明一个接受 void 指针但不返回值的函数 print_func,请使用void (*print_func)(void *)

编辑:省略 (*print_func) 周围的括号确实会创建一个函数指针,但对于返回指针的函数

于 2013-10-11T04:03:06.443 回答