如何在 C 中获取嵌套结构成员的偏移量?

How to get the offset of a nested struct member in C?

info 结构中打印 checksum 字段的偏移量的一种解决方案是使用宏 typeofoffsetof:

#include <stdio.h>
#include <stddef.h>
#include <stdint.h>

typedef struct
{
    struct {
       int a;
    } something;

    struct {
        int a;
        int b;
        int c[42];
        uint32_t checksum;
        int padding[10];
    } info[2];
    // ...
} S;

int main(void)
{   
    S s;
    printf("%lu\n", offsetof(typeof(s.info[0]), checksum));
    return 0;
}

不幸的是,typeof 不是标准的,所以我正在寻找一种更方便的方法来编写上面的示例,而不必在 S 之外声明 info

我为什么要这样做?

我有一个很大的结构,代表了代表信息块的闪存的内容。这些块中的每一个都有一个我想检查的校验和:

if (s.info[0].checksum != checksum(s.info[0], offsetof(typeof(s.info[0]), checksum))) {
    printf("Oops\n");
}

因为typeof.

写的不便携

使用指针算法。获取元素的地址,然后从结构的地址中减去它。

((unsigned char *) &(s.info[0]).checksum - (unsigned char *) &(s.info[0]))

我不知道您为什么认为(标准 C 中不存在)typeof 是必需的。如果你给结构一个标签 (information):

#include <stddef.h>
#include <stdint.h>
#include <stdio.h>

typedef struct
{
    struct {
        int a;
    } something;

    struct information {
        int a;
        int b;
        int c[42];
        uint32_t checksum;
        int padding[10];
    } info[2];
    // ...
} S;

int main(void)
{
    printf("%zu\n", offsetof(S, info[0].checksum));
    printf("%zu\n", offsetof(S, info[1].checksum));
    printf("%zu\n", offsetof(struct information, checksum));
    printf("%zu\n", offsetof(S, info[0].checksum) - offsetof(S, info[0].a));
    return 0;
}

示例运行:

$ ./a.out
180
400
176
176

顺便说一句,don't bother with typedefs for structs.它们没用。你不必相信我,但你可以相信 Peter van der Linden。