offsetof使用小结
Posted libra13179
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了offsetof使用小结相关的知识,希望对你有一定的参考价值。
先上例子
#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 ",(int)offsetof(struct foo,a)); printf ("offsetof(struct foo,b) is %d ",(int)offsetof(struct foo,b)); printf ("offsetof(struct foo,c) is %d ",(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使用小结的主要内容,如果未能解决你的问题,请参考以下文章