码迷,mamicode.com
首页 > 其他好文 > 详细

offsetof使用小结

时间:2018-06-14 18:30:13      阅读:825      评论:0      收藏:0      [点我收藏+]

标签:size_t   tdd   嵌入   gnu   color   size   src   强制转换   ima   

先上例子

#include <stdio.h>
#include <stdlib.h>

/* offsetof example */
#include <stddef.h>     /* offsetof */

struct foo {
  char a;
  char b[10];
  char c;
};

int main(void)
{

    printf ("offsetof(struct foo,a) is %d\n",(int)offsetof(struct foo,a));
    printf ("offsetof(struct foo,b) is %d\n",(int)offsetof(struct foo,b));
    printf ("offsetof(struct foo,c) is %d\n",(int)offsetof(struct foo,c));
    
    system("pause");
    return 0;
}

 测试结果:

技术分享图片

 

其原型

offsetof宏的定义如下:

#define offsetof(type, member) (size_t)&(((type*)0)->member)

  巧妙之处在于将地址0强制转换为type类型的指针,从而定位到member在结构体中偏移位置。编译器认为0是一个有效的地址,从而认为0是type指针的起始地址。

在不同的嵌入式系统里,不同开发商,不同架构处理器和编译器都有不同的offsetof定义形式:

/* Keil 8051 */

#define offsetof(s,m) (size_t)&(((s *)0)->m)

/* Microsoft x86 */

#define offsetof(s,m) (size_t)(unsigned long)&(((s *)0)->m)

/* Motorola coldfire */

#define offsetof(s,memb) ((size_t)((char *)&((s *)0)->memb-(char *)0))

/* GNU GCC 4.0.2 */

#define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER)

 

offsetof使用小结

标签:size_t   tdd   嵌入   gnu   color   size   src   强制转换   ima   

原文地址:https://www.cnblogs.com/libra13179/p/9183404.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!