例子
#include <stdio.h>
#include <string.h>
#include <stdint.h>
typedef uint32_t u32;
typedef uint16_t u16;
typedef uint8_t u8;
typedef union
{
struct
{
u8 plcRegStackHb : 1;
u8 plcRegFwDoorBool : 1;
u8 plcRegRsvdBit1 : 1;
u8 plcRegSlotStaBool : 1;
u8 plcRegRsvdBit2 : 1;
u8 plcRegRsvdBit3 : 1;
u8 plcRegRsvdBit4 : 1;
u8 plcRegRsvdBit5 : 1;
u8 plcRegRsvdWord;
} bStack;
struct
{
u8 plcRegSenFwDoorSw : 1;
u8 plcRegSenFirDoor : 1;
u8 plcRegSenTrayTouch : 1;
u8 plcRegSenTrayEnter : 1;
u8 plcRegSenSmoke : 1;
u8 plcRegSenSlotDoor : 1;
u8 plcRegSenBackDoor : 1;
u8 plcRegSenRsvdBit : 1;
u8 plcRegMaskFireDoor : 1;
u8 plcRegMaskTrayTouch : 1;
u8 plcRegMaskTrayEnter : 1;
u8 plcRegMaskSlotDoor : 1;
u8 plcRegMaskRsvd1 : 1;
u8 plcRegMaskRsvd2 : 1;
u8 plcRegMaskRsvd3 : 1;
u8 plcRegMaskRsvd4 : 1;
} b;
u16 SenSta;
} plcRegSenSta, *plcRegSenStaPtr;
/*所有串口设备共用消息头*/
typedef struct
{
u8 devAddr;
u8 funcCode; /*UartFuncCode*/
u8 payload1[1];
u8 pldLen; /*负载长度,不含消息头*/
u8 flowSeq;
u8 payload[0];
} UartMsgHead;
typedef void (*fun_type1)(plcRegSenSta a, plcRegSenSta b);
typedef void (*fun_type2)(plcRegSenSta *a, UartMsgHead *b);
typedef void (*fun_type3)(UartMsgHead a, UartMsgHead b);
typedef struct
{
fun_type1 A;
fun_type2 B;
fun_type3 C;
// int a;
} funname;
void fun1(plcRegSenSta num1, plcRegSenSta num2)
{
printf("fun1:b类型 %u %u %u %u %u\r\n", num1.b.plcRegSenFwDoorSw, num1.b.plcRegSenFirDoor, num1.b.plcRegSenTrayTouch, num1.b.plcRegSenTrayEnter, num1.b.plcRegSenSmoke);
printf("fun1:bStack类型 %u %u %u %u %u\r\n", num1.bStack.plcRegStackHb, num1.bStack.plcRegFwDoorBool, num1.bStack.plcRegRsvdBit1, num1.bStack.plcRegSlotStaBool, num1.bStack.plcRegRsvdBit2, num1.bStack.plcRegRsvdBit3);
}
void fun2(plcRegSenSta *num1, UartMsgHead *num2)
{
printf("fun2:b类型 %u %u %u %u %u\r\n", num1->b.plcRegSenFwDoorSw, num1->b.plcRegSenFirDoor, num1->b.plcRegSenTrayTouch, num1->b.plcRegSenTrayEnter, num1->b.plcRegSenSmoke);
printf("fun2: fun_Msg1->devAddr:%u fun_Msg1->funcCode:%u\r\n", num2->devAddr, num2->funcCode);
}
void fun3(UartMsgHead num1, UartMsgHead num2)
{
printf("fun3: fun_Msg1.devAddr:%u fun_Msg2.funcCode:%u\r\n", num1.devAddr, num2.funcCode);
}
int main(void)
{
u8 strnum[] = {'a', 'b', 'c', 'd', 'd', 'e', 'f', 'g', 'h', 'i'};
u8 strnum1[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};
funname str[] = {
{fun1, fun2, fun3},
};
plcRegSenSta *fun_sta1 = (plcRegSenSta *)&strnum[0];
plcRegSenSta *fun_sta2 = (plcRegSenSta *)&strnum[0];
UartMsgHead *fun_Msg1 = (UartMsgHead *)&strnum1[1];
UartMsgHead *fun_Msg2 = (UartMsgHead *)&strnum1[1];
str[0].A(*fun_sta1, *fun_sta2);
str[0].B(fun_sta1, fun_Msg1);
str[0].C(*fun_Msg1, *fun_Msg2);
printf("fun_type1类型字节大小:%d\r\n", sizeof(fun_type1));
printf("funname类型字节大小:%d\r\n", sizeof(funname));
printf("fun_sta1地址字节大小:%d\r\n", sizeof(fun_sta1));
printf("*fun_sta1变量字节大小:%d\r\n", sizeof(*fun_sta1));
printf("fun_Msg1变量字节大小:%d\r\n", sizeof(fun_Msg1));
printf("*fun_Msg1变量字节大小:%d\r\n", sizeof(*fun_Msg1));
return 0;
}
运行结果