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,编译通过没啥问题吧 各位老师,我也遇到类似的问题,使用AI8051U试验箱编译总是出现L57警告:代码已放到附件中
Build target 'Target 1'
linking...
*** WARNING L57: UNCALLED FUNCTION, IGNORED FOR OVERLAY PROCESS
NAME: Seg_Task/io
*** WARNING L57: UNCALLED FUNCTION, IGNORED FOR OVERLAY PROCESS
NAME: Task_1/io
Program Size: data=8.3 edata+hdata=378 xdata=192 const=105 code=5589
creating hex file from ".\Objects\demo"...
".\Objects\demo" - 0 Error(s), 2 Warning(s).
Build Time Elapsed:00:00:07
问题是凡是函数指针数组中调用的函数都不能被C251识别,但是实际程序运行是正常的,加REMOVEUNUSED不管用,
除了屏蔽L57警告之外,有什么办法能彻底消除这个问题,或者我的代码哪里不对?麻烦各位老师给指点一下,感谢!
页:
[1]