代码之家  ›  专栏  ›  技术社区  ›  Haspemulator

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

  •  1
  • Haspemulator  · 技术社区  · 14 年前

    请看一下这个宏。它在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是什么,为什么它在那里?有人能给我解释一下吗?

    3 回复  |  直到 14 年前
        1
  •  1
  •   Alex Martelli    14 年前

    “如果存在结构的成员 c 精确地在(完全对齐;)地址开始 0x1000 ,那么结构的成员将在哪个地址 f 是吗?”--回答:你要找的偏移量,当然减去假设的起始地址。 0x1000 对于结构…使用差,也就是距离或偏移量,计算为整数,否则地址算法中的自动缩放会让您失望(从何处进行转换)。

    表达式的哪些部分,特别是给你带来了问题?

    内部部分 &(((c *)0x1000)->f) 是“会员地址” f 假设结构的 C 位于 0x1000 . 就在它前面的是演员(我想 TInt 是某种整数类型,当然,那么 - 0x1000 获取偏移量(即感兴趣的特定成员的地址和整个结构的起点之间的距离或差)。

        2
  •  2
  •   SigTerm    14 年前

    Imo 0x1000 is just a randomly chosen number. It is not a valid pointer, and it you could probably use zero instead of it.

    它是如何工作的:

    1. 将0x1000强制转换为类指针(C类型的指针)。-(c*)0x1000
    2. 将指针指向类C &(;(c*)0x1000)-f(f)成员-& gt;f。
    3. 把它涂成浅色。((淡色)((C*)0x1000)->f))
    4. 将指向基的指针的整数值(在本例中为0x1000)从指向C成员的指针的整数值减去:((淡色)(&((C*)0x1000)->f))-0x1000)

    因为F没有被写入,所以没有访问冲突/segfault。

    您可能使用零而不是0x1000并放弃减法(即只使用“((tint)&((c*)0x0000)->f))”,但作者可能认为从指针到成员减法基指针比直接将指针强制转换为整数更为“合适”。或者编译器可能提供“隐藏”类成员,这些类成员可以有负偏移(在一些编译器中是可能的),例如Delphi编译器(我知道它不是C++)提供了多个隐藏的“字段”,它们位于“Soad”(类似于“这个”)指针之前,在这种情况下,使用0x1000而不是0是有意义的。

        3
  •  1
  •   sje397    14 年前

    它计算出地址为0x1000的类/结构的成员“f”的相对地址,然后减去0x1000,以便只返回类/结构地址和成员函数地址之间的差。我设想使用非零值(即0x1000)来避免空指针检测。