【发布时间】:2011-03-08 23:41:49
【问题描述】:
请看一下这个宏。用于 Symbian OS SDK,编译器基于 GCC(
#ifndef _FOFF
#if __GNUC__ < 4
#define _FOFF(c,f) (((TInt)&(((c *)0x1000)->f))-0x1000)
#else
#define _FOFF(c,f) __builtin_offsetof(c,f)
#endif
#endif
我知道它正在计算特定类/结构成员的偏移量。但我无法理解这个奇怪的说法是如何工作的——常数 0x1000 是什么,为什么会出现?有人可以向我解释一下吗?
【问题讨论】:
-
这基本上是来自
<stddef.h>的offsetof()。如果您阅读 Plauger 关于 C 库的书,您会知道它是几乎需要语言功能但并不完全需要的东西之一——所有系统都有实现它的方法。有时,变体的地址是 0 而不是 0x1000;我曾经有一个编译器反对地址 0,即使那是它的<stddef.h>中的内容;我改用 0x400(1 KB 偏移)解决了这个问题 - 破解了标题。那是很久以前的事了! -
@Jonathan,我还没有听说过这样的书。它的全名是什么?
-
这本书可能已经绝版了 - 但它是The Standard C Library,是 C89(而不是 C99)标准 C 库的实现。它对图书馆设计的方式和原因有很多宝贵的见解。