C251中函数指针数组的用法
最近在用STC32G12K128这颗芯片,移植之前的程序发现函数指针数组中调用的函数没有被识别。多次尝试后发现在C251中函数指针数据不能在定义时初始化,需要定义后,逐个赋值。这一点和C51有点不同。在定义时赋值无效:
typedef int(* Fuc)(int, int);
int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
int divi(int a, int b);
void main()
{
Fuc arr = {
add,
sub,
mul,
divi
};
编译报错误:
*** WARNING L57: UNCALLED FUNCTION, IGNORED FOR OVERLAY PROCESS
NAME: add/Demo
*** WARNING L57: UNCALLED FUNCTION, IGNORED FOR OVERLAY PROCESS
NAME: divi/Demo
*** WARNING L57: UNCALLED FUNCTION, IGNORED FOR OVERLAY PROCESS
NAME: sub/Demo
*** WARNING L57: UNCALLED FUNCTION, IGNORED FOR OVERLAY PROCESS
NAME: mul/Demo
定义后逐个赋值:
typedef int(* Fuc)(int, int);
int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
int divi(int a, int b);
void main()
{
Fuc arr;
arr = add;
arr = sub;
arr = mul;
arr = divi;编译可以通过。
个人感觉 用逐个赋值的写法更直观。 用法引人而异。之前在定义时赋值,是考虑到可以把函数指针放在flash里,节省ram空间。单片机有时太缺ram了。 确实有这个问题这两天写程序也是这样的,之前C51不报错,移植到C251就出现了 WARNING又不是ERROR,编译通过没啥问题吧
页:
[1]