offsetof宏的简介
定义
在stddef.h头文件中,该宏的完整说明如下:
360问答#ifdef__cplu谁善评splus
#ifdef_WIN64
#defineof改行商民养和挥fsetof(s,m)(size_t)((ptrdiff_t)&reinterpret_cast
概缺体政武分略集 #else
#d翻训棉争养助兵余雷距efineoffsetof(s,m)(size_t)&reinterpret_cast
#endif
#else
#ifdef_WIN64
唱章斗怀苏手清 #defineoffse态汽粒满临社阳胞tof(s,m)(size_t)((ptrd营染力益鲁识半iff_t)&(((s*)0)->m))
#else
#defineoffsetof(s,m)(s意制苗滑ize_t)&(((s*)0)->m)
#endif
#endif/*__cplusplus*/
功能
该宏用于求结构体中一个成员在该结构体中的偏移量。
在msdn上,该宏被写作:
size_toffse坐补走力跳福换降洲措tof(structName,memberName);
第一个参数是结构体的名字,第二个参数是结构体成员的名字。该宏返回结构体st急弱于婷停ructName中成员memberName的偏移量。偏移量是size_t类型的。
编辑本段
程序示例
#include
#inclu厚史构素某带更星变de
typedefstruct
{
intiVal;
intiVal2;
}Test;
typedefstruct
{
charch;
intiNum;
}Test2;
i安消四婷厚老怎ntmain(void)
书编含再景找征氧八操{
Testt={1,2};
Test2t2={'t',100};
printf("\naddressoft:%p\naddressof***.ival:%p\naddressof***.ival2:%p\n\n",&t,&(***.ival),&(***.ival2));
printf("offsetofiValint:%p\n",offsetof(Test,iVal));
printf("offsetofiVal2int:%p\n",offsetof(Test,iVal2));
printf("\naddressoft2:%p\naddressoft2.ch:%p\naddressof***.inum:%p\n\n",&t,&(t2.ch),&(***.inum));
printf("offsetofchint2:%p\n",offsetof(Test2,ch));
printf("offsetofiNumint2:%p\n",offsetof(Test2,iNum));
return0;
}
在VS2005中输出:
addressoft:0012FF10
addressof***.ival:0012FF10
addressof***.ival2:0012FF14
offsetofiValint:00000000
offsetofiVal2int:00000004
addressoft2:0012FF10
addressoft2.ch:0012FF00
addressof***.inum:0012FF04
offsetofchint2:00000000
offsetofiNumint2:00000004
需要注意的是,Test2中iNum成员的偏移量