templeton 发表于 2023-3-4 22:27:04

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;编译可以通过。

社区闲人 发表于 2023-3-5 09:05:16

个人感觉 用逐个赋值的写法更直观。

templeton 发表于 2023-3-5 20:12:18

用法引人而异。之前在定义时赋值,是考虑到可以把函数指针放在flash里,节省ram空间。单片机有时太缺ram了。

咫尺天涯 发表于 2024-3-7 23:28:54

确实有这个问题这两天写程序也是这样的,之前C51不报错,移植到C251就出现了

rengran 发表于 2024-3-8 18:10:50

WARNING又不是ERROR,编译通过没啥问题吧

小涵子爸爸 发表于 昨天 10:49

各位老师,我也遇到类似的问题,使用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]
查看完整版本: C251中函数指针数组的用法