如何读懂这个表达?
How to read this expression?
(long)&((FLASH_CONF_STRUCT*)0)->vlan
FLASH_CONF_STRUCT
是一个struct类型,vlan
是这个struct的成员。
这个表达式怎么拼?
(FLASH_CONF_STRUCT*)
是类型转换。它将 0
转换为指向 FLASH_CONF_STRUCT
的指针。我们称之为 ptr
.
ptr->vlan
等同于 (*ptr).vlan
。它访问 ptr
.
指向的结构的 vlan
字段
&
得到后面的地址,所以vlan
的偏移量加到ptr
.
(long)
将地址转换为 long
.
总的来说,这是为了获得vlan
在结构中的偏移量。但我怀疑它调用了 Undefined Behaviour (因为它至少取消了对 NULL 指针的引用)。而且它这样做是不必要的。
替换
long ofs = (long)&((FLASH_CONF_STRUCT*)0)->vlan;
更具可读性
#include <stddef.h>
size_t ofs = offsetof(FLASH_CONF_STRUCT, vlan);
例如,
#include <stddef.h>
#include <stdio.h>
typedef struct {
int a;
int b;
int vlan;
} FLASH_CONF_STRUCT;
int main(void) {
printf("%ld\n", (long)&((FLASH_CONF_STRUCT*)0)->vlan);
printf("%zu\n", offsetof(FLASH_CONF_STRUCT, vlan));
return 0;
}
输出:
$ gcc -Wall -Wextra -pedantic-errors -std=c99 a.c -o a && a
8
8
(long)&((FLASH_CONF_STRUCT*)0)->vlan
FLASH_CONF_STRUCT
是一个struct类型,vlan
是这个struct的成员。
这个表达式怎么拼?
(FLASH_CONF_STRUCT*)
是类型转换。它将 0
转换为指向 FLASH_CONF_STRUCT
的指针。我们称之为 ptr
.
ptr->vlan
等同于 (*ptr).vlan
。它访问 ptr
.
vlan
字段
&
得到后面的地址,所以vlan
的偏移量加到ptr
.
(long)
将地址转换为 long
.
总的来说,这是为了获得vlan
在结构中的偏移量。但我怀疑它调用了 Undefined Behaviour (因为它至少取消了对 NULL 指针的引用)。而且它这样做是不必要的。
替换
long ofs = (long)&((FLASH_CONF_STRUCT*)0)->vlan;
更具可读性
#include <stddef.h>
size_t ofs = offsetof(FLASH_CONF_STRUCT, vlan);
例如,
#include <stddef.h>
#include <stdio.h>
typedef struct {
int a;
int b;
int vlan;
} FLASH_CONF_STRUCT;
int main(void) {
printf("%ld\n", (long)&((FLASH_CONF_STRUCT*)0)->vlan);
printf("%zu\n", offsetof(FLASH_CONF_STRUCT, vlan));
return 0;
}
输出:
$ gcc -Wall -Wextra -pedantic-errors -std=c99 a.c -o a && a
8
8