例如,在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)