c++中的offsetof可以求取结构体中某元素的相对偏移地址。
offsetof(TYPE, MEMBER)的宏定义如下:
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER);
分析如下:
(TYPE *)0,将 0 强制转换为 TYPE 型指针,记 p = (TYPE *)0,p是指向TYPE的指针,它的值是0。那么 p->MEMBER 就是 MEMBER 这个元素了,而&(p->MEMBER)就是MENBER的地址,而基地址为0。这样就巧妙的转化为了TYPE中的偏移量。再把结果强制转换为size_t型的就OK了。这里的size_t其实就是usigned int。
typedef __kernel_size_t size_t;
typedef unsigned int __kernel_size_t;
因此该宏的作用就是求出MEMBER在TYPE中的偏移量。这个在程序中有时候用到求取TYPE中某MEMBER的偏移量,但是我们又可能频繁修改我们的结构体(TYPE)时提供了方便。我们不需要在我们增加或减少结构体成员而影响到原先成员顺序时,改变程序中曾经求取对应原先成员偏移量的代码。
网友评论