(long)&((FLASH_CONF_STRUCT*)0)->vlan
[FLASH_CONF_STRUCT
是结构类型,vlan
是该结构的成员。
如何拼写此表达式?
(FLASH_CONF_STRUCT*)
是类型转换。它会将0
强制转换为指向FLASH_CONF_STRUCT
的指针。我们称它为ptr
。
ptr->vlan
等效于(*ptr).vlan
。它访问由vlan
指向的结构的ptr
字段。
[&
获得后面的地址,因此将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