我试图在 C 中定义一个指向函数的指针,然后将该指针分配给一个函数。我找到的所有示例都是带有参数和返回值的函数,但我的函数两者都没有。
我在 MPLAB XC8
编译器上尝试过的所有操作都会导致 'main.c:39:9: error:initializing 'void (*)()' with an expression of in兼容类型'void''
或 'main.c:39:18: error: 表达式不可分配'
错误。
scan_KP()
是键盘扫描函数
这是我对指针的声明:
void (*KP_ScanPTR)(void);
现在我想把函数scan_KP的地址赋给指针;这是我尝试过的:
(*KP_ScanPTR)() = scan_KP();
void (*KP_ScanPTR)() = scan_KP();
void (*KP_ScanPTR)(void) = scan_KP();
这会导致“main.c:39:28:错误:预期表达式”,但我没想到它会起作用:
(*KP_ScanPTR)() = scan_KP(void);
这个我也试过了。有趣的是,我得到: main.c:39:8: error:用不兼容类型“void”的表达式初始化“int (*)()”。所以我认为声明是正确的,因为它知道没有参数并且 scan_KP() 没有返回;:
int (*KP_ScanPTR)() = scan_KP();
这是我用作引用的代码示例:
#include<stdio.h>
int subtraction (int a, int b) {
return a-b;
}
int main() {
int (*fp) (int, int)=subtraction;
//Calling function using function pointer
int result = fp(5, 4);
printf(" Using function pointer we get the result: %d",result);
return 0;
}
我也审阅了这个问题A pointer to a function还有这个Returning a pointer to a function第二个显示类似的语法
int funcA(int a, int b) { ... }
int (*funcB)(int, int) = funcA;
所以我删除了参数并返回,但它没有。
那么我在这里做错了什么?
最佳答案
scan_KP()
中的括号导致您的函数被调用,而不是获取其地址。结果是一个类型为 void
的表达式 - 我根本不确定它算不算一个表达式,而且它绝对不是分配给函数指针的正确类型。
只需省略括号,与您引用的两个示例一致:
void (*KP_ScanPTR)(void) = scan_KP;
您还可以添加地址运算符&
:
void (*KP_ScanPTR)(void) = &scan_KP;
对于编译器来说,这没有什么区别,但对于人类读者来说,它可以更清楚地表明函数的地址正在被获取。
关于c - 如何在 C 中定义指向函数的指针并将该指针分配给函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77397385/