/* 结构体某个变量的相对偏移量 */
#define GET_OFFSET_OF_M_IN_STRUCT(__STRUCT, __m) (size_t)&(((__STRUCT*)0)->__m)
(__STRUCT*)0 //表示将常量0强制转化为__STRUCT*型指针所指向的地址, 当然也可以是x,只是到最后还要减去这个x的值
((__STRUCT*)0)->__m //表示在0地址处的结构体__STRUCT的成员__m
&(((__STRUCT*)0)->__m) //表示取结构体指针(__STRUCT*)0的成员__m的地址,因为该结构体的首地址为0,所以其实就是得到了__m距离结构体首地址的偏移量.
(size_t) //是一种数据类型,为了便于不同系统之间移植而定义的一种无符号型数据,一般为unsigned int
{
u8 ucManuFactory;
u8 ucGroup;
u8 ucId;
u8 aucServerSite[SERVER_SITE_NAME_LEN]; /* 服务器网址 or IP */
u16 usServerPort; /* 服务器端口号 */
} INFO_T;
INFO_T stInfo;
u16 usOffset = 0;
u32 uiAddr = 0;
u8 *pucAddr = &stInfo.usServerPort;
usOffset = GET_OFFSET_OF_M_IN_STRUCT(CRANE_FACTORY_INFO_T, ucId);
usOffset = GET_OFFSET_OF_M_IN_STRUCT(CRANE_FACTORY_INFO_T, usServerPort);
uiAddr = GET_STRUCT_ADDR_BY_M(CRANE_FACTORY_INFO_T, pucAddr, usServerPort);