我不是C ++程序员,并且在源代码中遇到以下宏定义:

// HACK: gcc warns about applying offsetof() to non-POD object or calculating
//       offset directly when base address is NULL. Use 16 to get around the
//       warning. gcc-3.4 has an option -Wno-invalid-offsetof to suppress
//       this warning.
#define offset_of(klass,field) (size_t)((intx)&(((klass*)16)->field) - 16)


我感到困惑的事实是:


((klass*)16)->field)将16转换为klass*,然后插入字段field
(intx)&(...)按位还是使用intx或强制转换为引用某些类型intx


其中intx定义如下:

typedef intptr_t  intx

最佳答案

在这种情况下,&是地址运算符,将field的地址放在klass类型内。

剩下的只是括号的问题,以确保您在正确的位置获得了RIGHT位,并进行了多次强制转换以确保指向field的指针是可以强制转换为size_t的整数类型。

关于c++ - 如何理解宏定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48487885/

10-15 06:55