#define offsetof(TYPE, MEMBER) (size_t)(&(((TYPE*)0)->MEMBER))
2014-08-04 15:43
429 查看
#define offsetof(TYPE, MEMBER) (size_t)(&(((TYPE*)0)->MEMBER))
1.(TYPE*)0 将0强转为TYPE类型的指针,且指向了0地址空间
2.(TYPE*)0->MEMEBER 指向结构体中的成员
3.&((TYPE*)0->MEMBER) 获取成员在结构体的位置,因为起始为0,所以获取的地址即为实际的偏移地址
分析:
(TYPE *)0,将 0 强制转换为 TYPE 型指针,记 p = (TYPE *)0,p是指向TYPE的指针,它的值是0。那么 p->MEMBER 就是 MEMBER 这个元素了,而&(p->MEMBER)就是MENBER的地址,而基地址为0,这样就巧妙的转化为了TYPE中的偏移量。再把结果强制转换为size_t型的就OK了,size_t其实也就是int。
1.(TYPE*)0 将0强转为TYPE类型的指针,且指向了0地址空间
2.(TYPE*)0->MEMEBER 指向结构体中的成员
3.&((TYPE*)0->MEMBER) 获取成员在结构体的位置,因为起始为0,所以获取的地址即为实际的偏移地址
分析:
(TYPE *)0,将 0 强制转换为 TYPE 型指针,记 p = (TYPE *)0,p是指向TYPE的指针,它的值是0。那么 p->MEMBER 就是 MEMBER 这个元素了,而&(p->MEMBER)就是MENBER的地址,而基地址为0,这样就巧妙的转化为了TYPE中的偏移量。再把结果强制转换为size_t型的就OK了,size_t其实也就是int。
相关文章推荐
- #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER);
- #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
- #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
- #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
- ((size_t) &((TYPE*)0)->MEMBER)
- 如何解释 #define OFFSET(struct_type, member) ((size_t) &((struct_type *) 0)->member)
- vector<int>::size_type 解释
- 理解vector<T>::size_type类型
- vector<string>::size_type与string::size_type
- (size_t) & ((struct element *) 0) -> member
- #define offsetof(s,m) (size_t)&(((s *)0)->m)
- std::vector<std::string>::size_type和 int的区别
- #define offsetof(s,m) (size_t)&(((s *)0)->m)
- #define FIND(struc,e) (size_t)&(((struc*)0)->e)
- offsetof(TYPE, MEMBER)
- #define offsetof(STRUCTURE,FIELD) ((int)((char*)&((STRUCTURE*)0)->FIELD))
- There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key ''.
- int( (LONG)(LONG_PTR)&(((type *)0)->field))的最好解释
- TypeList 之 DerivedToFront 把类型链表中类型按继承层次排序(子类 -> 基类)
- Item 46: Define non-member functions inside templates when type conversions are desired(Effective C++)