【问题标题】:C/C++ Structure offsetC/C++ 结构偏移
【发布时间】:2008-09-26 21:15:16
【问题描述】:

我正在寻找一段代码,它可以告诉我结构中字段的偏移量,而无需分配结构的实例。

IE:给定

struct mstct {
    int myfield;
    int myfield2;
};

我会写:

mstct thing;
printf("offset %lu\n", (unsigned long)(&thing.myfield2 - &thing));

并获取offset 4 作为输出。如果没有 mstct thing 声明/分配一个,我该怎么办?

我知道&<struct> 并不总是指向结构的第一个字段的第一个字节,我可以稍后解释。

【问题讨论】:

    标签: c++ c oop


    【解决方案1】:

    标准的 offsetof() 宏(在 stddef.h 中)怎么样?

    编辑:对于由于某种原因可能没有可用的 offsetof() 宏的人,您可以使用以下方法获得效果:

    #define OFFSETOF(type, field)    ((unsigned long) &(((type *) 0)->field))
    

    【讨论】:

    • 不是我想要的,因为我没有 stddef.h,但它确实回答了我的问题:#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) 0)->会员)
    • 哇 - 没有 stddef.h?只是出于好奇,我能问一下你用的是什么吗?
    • 它在 C99 标准中,所以我建议使用新的编译器。
    • 不仅如此 - 自 ANSI C89 以来它一直在 C 中。我不知道它在标准之前有多常见(或不常见)。
    • 我曾经有一个 C 编译器,它在 stddef.h 中使用零技巧定义了 offsetof(),但它也不允许使用零作为基地址。 (很久以前 - 1989 年左右。)解决方法是将 0 改为 1024。
    【解决方案2】:

    好吧,使用 offsetof 宏,它(至少在 GNU CC 中)可用于 C 和 C++ 代码:

    offsetof(struct mstct, myfield2)
    

    【讨论】:

    • offsetof() 自第一个 ANSI C89 标准以来一直采用标准 C/C++。每个编译器都应该拥有它,除非您使用的是非常古老的东西。即使这样,它也可以使用丑陋的强制转换和指针算法拼凑在一起。
    • 同意 - 我很可能会提供一个虚拟的 来提供该宏。 Plauger 提供“标准 C 库”,它是一个易于提供的标头 - 只要它不必是可移植的。
    • AFAIK,offsetof() 不是 hing but 丑陋的铸造和指针算术......类似于:#define offsetof(type, field) ((char *)&( ((type *)0)->field) - (char *)0)
    【解决方案3】:

    printf("偏移量: %d\n", &((mstct*)0)->myfield2);

    【讨论】:

    • 除了offsetof 以更易读的方式执行此操作之外,您通常无法使用%d 打印ptrdiff_t -- 在LP64 系统上,它太大了。跨度>
    猜你喜欢
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多