求结构体某个变量的相对偏移量

来源:互联网 发布:发票数据怎么导出电子 编辑:程序博客网 时间:2024/05/01 22:34


/* 结构体某个变量的相对偏移量 */ 
#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


//扩展一下,现在知道这个变量的地址,求结构体的首地址
#define GET_STRUCT_ADDR_BY_M(__STRUCT, __pm, __m)((int)__pm - (int)(&(((__STRUCT*)0)->__m)))

typedef struct 
{
    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);

原创粉丝点击