如何在 C 中获取嵌套结构成员的偏移量?
How to get the offset of a nested struct member in C?
在 info
结构中打印 checksum
字段的偏移量的一种解决方案是使用宏 typeof
和 offsetof
:
#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。
在 info
结构中打印 checksum
字段的偏移量的一种解决方案是使用宏 typeof
和 offsetof
:
#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。