请看一下这个宏。它在Symbian OS SDK中使用,该编译器基于GCC(小于4版本)。
#ifndef _FOFF
#if __GNUC__ < 4
#define _FOFF(c,f) (((TInt)&(((c *)0x1000)->f))-0x1000)
#else
#define _FOFF(c,f) __builtin_offsetof(c,f)
#endif
#endif
我了解它正在计算特定类/结构成员的偏移量。但是我不明白那个奇怪的语句是如何工作的-常数0x1000是什么,为什么在那里呢?有人可以向我解释一下吗?
最佳答案
“如果有一个结构c
的成员恰好在(完全对齐;-)地址0x1000
开头,那么该结构的成员f
会在什么地址? -答案:您要寻找的偏移量,当然要减去该结构的假设起始地址0x1000
...以差异,AKA距离或偏移量计算为整数,否则地址算术的自动缩放会使您不满意( Actor 表)。
具体来说,表达式的哪些部分给您带来了问题?
内部&(((c *)0x1000)->f)
是“位于f
的假设结构c
的成员0x1000
的地址。它的前面是强制类型转换(我当然认为TInt
是某种整数类型),然后- 0x1000
获得偏移量(又称距离或感兴趣的特定成员的地址与整个结构的开头之间的差)。