我找到了一种计算struct偏移量的方法。如下:
#define offsetOf(type , f) ((int)\
((char *)&((struct tagName*)0)->f-(char*)(struct tagName*)0));
但我经常这样写:
#define offsetOf(type , f) ((int)(&((struct tagName*)0)->f);
本书说,NULL指针的减法是为了确保当NULL指针的内部非零时它是正确的。但我认为NULL指针的内部不会影响NULL指针的地址。
答案 0 :(得分:3)
为什么不使用stddef.h中定义的标准offsetof()宏?
答案 1 :(得分:3)
标准库应提供完全符合您要求的offsetof
,我强烈建议您使用它,因为许多编译器会针对自定义变体所需的代码类型发出警告
无论如何,减法会将您的代码从指针域带到size_t
的域。我会说这有点安全。
答案 2 :(得分:1)
int
来保存内存地址,使用uintptr_t
。或者只使用offsetof
代替您自己的宏。
0
永远不会被定义为0以外的东西,减去(char *)0是错误的。这是什么书?当然,您处理的地址只是虚拟地址,但您的程序永远不会看到真实的地址。
该语句可能对NULL
不为0的非常模糊的系统有意义,并且在宏中用NULL
替换0。当然,如果这个系统存在,很容易理解为什么它不为人所知并且可能是一个很大的失败。