请看一下这个宏。它在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获得偏移量(又称距离或感兴趣的特定成员的地址与整个结构的开头之间的差)。

10-08 08:34