繁体   English   中英

成员偏移宏 - 需要详细信息

[英]Member offset macro - need details

请看一下这个宏。 它用于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,为什么会出现? 有人可以向我解释一下吗?

Imo 0x1000只是一个随机选择的数字。 它不是一个有效的指针,你可以使用零而不是它。

这个怎么运作:

  1. 将0x1000转换为类指针(类型为c的指针)。 - (c *)0x1000
  2. 指向类c的“f”成员 - &(((c *)0x1000) - > f)
  3. 将其转换为TInt。 ((TInt)&(((c *)0x1000) - > f))
  4. 从指向c的成员的指针的整数值,将指针的整数值(在本例中为0x1000)子结构:(((TInt)&(((c *)0x1000) - > f)) - 0x1000)

因为没有写入,没有accessViolation / segfault。

您可以使用零而不是0x1000并丢弃减法(即只使用“((TInt)&(((c *)0x0000) - > f))”),但也许作者认为从指针到成员减去基指针是一种比直接将指针转换为整数更“正确”的方法。 或者也许编译器提供可以具有负偏移的“隐藏”类成员(这在某些编译器中是可能的 - 例如Delphi编译器(我知道它不是c ++)提供了位于“self”之前的多个隐藏“字段”(模拟) “this”)指针),在这种情况下使用0x1000而不是0是有意义的。

它正在计算'f'的相对地址作为地址0x1000的类/结构的成员,然后减去0x1000,以便只返回类/结构地址和成员函数地址之间的差异。 我想一个非零值(即0x1000)用于避免空指针检测。

“如果有一个struct c的成员正好在(完全对齐的;-)地址0x1000 ,那么struct的成员f将在什么地址?” - 回答:你正在寻找的偏移量,当然减去结构的假设起始地址0x1000 ......差异,AKA距离或偏移量,以整数计算,否则地址算术中的自动缩放会抛弃你(演员)。

具体来说,表达的哪些部分会给你带来问题?

内部部分&(((c *)0x1000)->f)是“位于0x1000的假设结构c的成员f的地址。在它前面是演员(我假设TInt是某种整数类型) ,当然),然后- 0x1000得到偏移量(AKA距离或感兴趣的特定成员的地址与整个结构的开始之间的差异)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM