typedef和函式指標
阿新 • • 發佈:2019-02-06
在《函式指標實現程式跳轉》裡有一個值得討論的地方,就是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[] =
{
0 x182106C0, 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,
0 xD7A3D8B3, 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強制轉換成了函式指標,即指向以該地址為入口的函式,最終實現了函式呼叫。