typedef和函数指针

在《函数指针实现程序跳转》里有一个值得讨论的地方,就是typedef的用法,过去最经常看到的用法都是:

typedef unsigned char       uint8_t;
typedef unsigned short int  uint16_t;
typedef unsigned long int   uint32_t;

久而久之就会有一种错觉,认为typedef和#define是一样的功能,实现两个文本(数据类型名)的替换,直到看到函数指针的定义:

typedef void (*pfun)(void);
typedef UINT32 (*PFLASHINIT) ( PSSD_CONFIG pSSDConfig );

如果按照#define的定义去看就会理解不了,实际上这两个的含义是:
定义了一个类型pfun,它是一个函数指针,指向一个无参数无返回值的函数;
定义了一个类型PFLASHINIT,它是一个函数指针,指向一个函数,该函数的参数是类型为PSSD_CONFIG 的 pSSDConfig,返回值是UINT32;


以第二个复杂的函数指针为例

typedef UINT32 (*PFLASHINIT) ( PSSD_CONFIG pSSDConfig );
define pFlashInit                  ((PFLASHINIT)FlashInit_C)

const uint32_t FlashInit_C[] =
{
    0x182106C0, 0x00801AC1, 0x09185401, 0x0044480F, 0x30030034,
    0x2A00E655, 0xC0E373BE, 0xE0001BBD, 0xD1E0C00E, 0x44D0D00E,
    0xC0E3CE03, 0xC2EE6600, 0xE62AC0D3, 0x77D70F3D, 0x77CCF73D,
    0x77CBDF3D, 0x77D8C73D, 0x77D9AF3D, 0x52DD0000, 0x77DA973D,
    0x77DB7F3D, 0x77DC673D, 0x77C04F3D, 0x1AD6D203, 0x77DE36BD,
    0x56DD0000, 0x56E30008, 0x5583000C, 0x55630010, 0xD583D693,
    0xD7A3D8B3, 0xD9C3DA03, 0xDBE3E81F, 0x77C00F3D, 0x77DCF77D,
    0xD203D3C3, 0x77C0E73D, 0xD40377DC, 0xCF3DD5C3, 0x77C0B77D,
    0xD60377DC, 0xA73DD7C3, 0x77C08F3D, 0xD80377DC, 0x777DD9C3,
    0x77C0673D, 0x77DE4EBD, 0xDA03DBE3, 0x3003003C, 0x2A00E607,
    0x01F31800, 0xD0000000, 0x1800D000, 0x01F35001, 0x00441AC1,
    0x08180090, 0x18218040, 0x00044D50, 0x43353546, 0x49313130
};

returnCode = pFlashInit(&ssdConfig); //实现了函数调用的功能

FlashInit_C[]数组里放的是FlashInit(姑且这么叫)函数的十六进制代码(从s19文件内获得),((PFLASHINIT)FlashInit_C)将该数组的首地址FlashInit_C强制转换成了函数指针,即指向以该地址为入口的函数,最终实现了函数调用。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值