首页 > C语言 > 计算结构体成员偏移值offsetof

计算结构体成员偏移值offsetof

    一个比较有意思的宏,不知道大家见得多不多。我见得不多,但是偶尔也会用一下。最早看到offsetof这个宏,不知道是从哪里看到的一道面试题,就是求结构体的成员相对于结构体的偏移值,第一个想到的方法当然是对结构体变量的成员和对应的结构体变量取地址操作然后相减;如果不定义结构体变量,那么又该如何操作呢?这时候offsetof就派上用场了,当然,我们感兴趣的是offsetof的内部实现。

下面这段代码是我从Visual Studio 2005的里面复制出来的:(可以看到实现很巧妙)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* Define offsetof macro */
#ifdef __cplusplus
 
#ifdef  _WIN64
#define offsetof(s,m)   (size_t)( (ptrdiff_t)&reinterpret_cast<const volatile char&>((((s *)0)->m)) )
#else
#define offsetof(s,m)   (size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m))
#endif
 
#else
 
#ifdef  _WIN64
#define offsetof(s,m)   (size_t)( (ptrdiff_t)&(((s *)0)->m) )
#else
#define offsetof(s,m)   (size_t)&(((s *)0)->m)
#endif
 
#endif	/* __cplusplus */

最后我不得不承认,在面试或者笔试过程中不时会遇到一些未曾见过的宏或者库函数。


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> 计算结构体成员偏移值offsetof
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



分类: C语言 标签: , , ,
  1. 2011年11月16日13:43 | #1

    平时用到的宏不多,最多也就是HIWORD,LOWORD。

    [回复]

    代码疯子 回复:

    @gewala, 嗯,一般用的不多。某一次笔试,遇到个calloc与malloc的区别,当时我表示从未见过……

    [回复]

  2. 2011年11月19日16:15 | #2

    反正现在看你写的东西 看不懂了 [em017]

    [回复]

    代码疯子 回复:

    @tanglei, 这是C语言啊 [em017] 结构体问题 你应该懂得

    [回复]

  3. Hacksign
    2011年12月12日16:05 | #3

    这个技巧在linux内核里面非常常见,通过常量 地址的强转得到一个数据类型 [em022]

    [回复]

    代码疯子 回复:

    @Hacksign, 好像嵌入式里面见得也比较多,本人编程用的很少

    [回复]