我试图在 C 中定义一个指向函数的指针,然后将该指针分配给一个函数。我找到的所有示例都是带有参数和返回值的函数,但我的函数两者都没有。
我使用
MPLAB XC8
编译器尝试过的所有操作都会导致 'main.c:39:9: error: initializing 'void (*)()' with an expression of incompatible type 'void''
或 'main.c:39:18: error: expression is not assignable'
错误。
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: error:预期表达式”,但我没想到它会起作用:
(*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;
}
我还回顾了这个问题指向函数的指针和这个返回指向函数的指针第二个显示了类似的语法
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;
对于编译器来说,这没有什么区别,但对于人类读者来说,它可以更清楚地表明函数的地址正在被获取。