4

checksum打印结构中字段偏移量的一种解决方案info是使用宏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这不是标准的,所以我正在寻找一种更方便的方法来编写上面的示例,而无需在info外部声明 from S

为什么我要这样做?

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

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

由于typeof.

4

2 回答 2

3

我不知道您为什么认为(标准 C 中不存在)typeof是必需的。offsetof如果你给结构一个标签( ) ,这会很顺利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

顺便说一句,不要为结构的 typedef 烦恼。他们没用。你不必相信我,但你可以相信彼得·范德林登。

于 2017-03-17T09:31:12.087 回答
0

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

((unsigned char *) &(s.info[0]).checksum - (unsigned char *) &(s.info[0]))
于 2017-03-17T09:23:51.300 回答