相关疑难解决方法(0)

一种可移植的方法,使用指向结构内声明的字段的指针计算指向整个结构的指针(又名CONTAINING_RECORD宏)

例如,在Winnt.h中定义了众所周知的CONTAINING_RECORD()宏:

#define CONTAINING_RECORD(address, type, field) ((type *)( \
                                              (PCHAR)(address) - \
                                              (ULONG_PTR)(&((type *)0)->field)))
Run Code Online (Sandbox Code Playgroud)

或者在FreeBSD中:

#define CONTAINING_RECORD(addr, type, field)    \
      ((type *)((vm_offset_t)(addr) - (vm_offset_t)(&((type *)0)->field)))
Run Code Online (Sandbox Code Playgroud)

或者在Linux中:

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#define container_of(ptr, type, member) ({                      \
      const typeof(((type *)0)->member) * __mptr = (ptr);     \
      (type *)((char *)__mptr - offsetof(type, member)); })
Run Code Online (Sandbox Code Playgroud)

而且,当然,在全世界许多其他地方.

但是,我怀疑它们是否符合标准.

提升源(boost_1_48_0/boost/intrusive/detail/parent_from_meber.hpp)让我失望 - 他们有3个#ifdef PARTICULAR_COMPILER案例:

template<class Parent, class Member>
inline std::ptrdiff_t offset_from_pointer_to_member(const Member Parent::* ptr_to_member)
{
   //The implementation of a pointer to member is compiler dependent.
   #if …
Run Code Online (Sandbox Code Playgroud)

c c++

6
推荐指数
1
解决办法
4189
查看次数

标签 统计

c ×1

c++ ×1