微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

回调函数在C中的void表达式有问题吗?

如何解决回调函数在C中的void表达式有问题吗?

我正在学习C语言中的函数指针的基础知识及其回调。但是由于第15行,我陷入了困境。源代码无法编译。编译器说

在“主要”功能中: 错误:无效使用无效表达式@ call_fun(displayMessage(Message))

#include <stdio.h>

void displayMessage( void * string){
printf("%s\n",(char*)string);
}

//function pointer as argument
void call_fun (void (*funPtr)()) {
displayMessage(); // call Back function that funPtr points out to 
}

int main(){
char * Message = " Hello World";
call_fun(displayMessage(Message));
return 0;
}

提前谢谢大家

解决方法

这个...

void (*funPtr)()

...将funPtr声明为指向非变量函数的指针,该函数接受未指定类型的未指定数量的参数,并返回void

这个...

displayMessage(Message)

...是函数 call ,在您的情况下,其类型为void。类型voidvoid (*funPtr)()不兼容。

大概是您希望将指针传递给 displayMessage,而不是调用结果 displayMessage。对于前者,只需使用函数名称:

call_fun(displayMessage);

但是您会很快注意到消息本身未出现在该表达式中,如果您希望调用call_fun的代码指定消息传递给displayMessage,这将是一个问题。为此,您需要将消息作为单独的参数传递,或者想出其他方法将其传递给call_func *

您还应该考虑功能call_fun()。您应该认识到它声明了参数funPtr,但是从不引用它。您还应该认识到它显式地调用了displayMessage()(参数数目错误),如果它的调用者被认为是指定要调用的函数的调用者,则没有意义。此外,尽管允许声明不提供原型的函数指针,但用原型声明函数指针几乎总是更好。

总体,然后:

#include <stdio.h>

void displayMessage(const char *string) {
    printf("%s\n",string);
}

//function pointer as argument
void call_fun (void (*funPtr)(const char *),const char *message) {
    funPtr(message); // call the function that funPtr points out to 
}

int main(void) {
    const char *Message = "Hello World";
    call_fun(displayMessage,Message);
    return 0;
}

* 但是,更典型的回调方案是让一个组件将(回调)函数指定给另一个组件,该组件选择调用的时间和参数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。