以下代码及其输出:
#include <stdio.h>
int x = 0;
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)x)->MEMBER)
#define offsetof_1(TYPE, MEMBER) ((size_t) &((TYPE *)1)->MEMBER)
#define offsetof_2(TYPE, MEMBER) ((size_t) &((TYPE *)2)->MEMBER)
#define offsetof_3(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
struct test{};
struct m {
int b;
char w;
struct test t;
int c;
};
int main(void) {
printf("Checking:%x\n",offsetof(struct m,b));
printf("Checking:%x\n",offsetof_1(struct m,b));
printf("Checking:%x\n",offsetof_2(struct m,b));
printf("Checking:%x\n",offsetof_3(struct m,b));
return 0;
}
Output:
Checking:0
Checking:1
Checking:2
Checking:0
我试图理解这里使用的类型转换。我认为,编译器的作用是将其视为(type *)(value)
从地址(值)开始的类型。因此,对于给定的结构,预期值为 0,即 offsetof 为 b,但由于我们使用不同的值进行类型转换,我们得到不同的偏移量。请让我知道我的理解是否正确。我只是想了解文字是如何进行类型转换的及其含义。这在Linux内核中使用。因此也标记了它们。