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,编译通过没啥问题吧
页: [1]
查看完整版本: C251中函数指针数组的用法