offsetof 宏的简介

原文地址:http://baike.baidu.com/view/5513779.htm

定义

  在stddef.h头文件中,该宏的完整说明如下:  

  #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 */ 


功能

  该宏用于求结构体中一个成员在该结构体中的偏移量。

  在msdn上,该宏被写作:

  size_t offsetof( structName, memberName );

  第一个参数是结构体的名字,第二个参数是结构体成员的名字。该宏返回结构体structName中成员memberName的偏移量。偏移量是size_t类型的。

程序示例

    #include <stdio.h> 
    #include <stddef.h> 

  typedef struct 
  { 
  	int iVal; 
  	int iVal2; 
  }Test; 

  typedef struct 
  { 
  	char ch; 
  	int iNum; 
  }Test2; 

  int main(void) 
  { 
  	Test t = {1, 2}; 
  	Test2 t2 = {'t', 100}; 
  	printf("\naddress of t : %p\naddress of t.iVal : %p\naddress of t.iVal2: %p\n\n", &t, &(t.iVal), &(t.iVal2)); 
  	printf("offset of iVal in t: %p\n", offsetof(Test, iVal)); 
  	printf("offset of iVal2 in t: %p\n", offsetof(Test, iVal2)); 
  	printf("\naddress of t2 : %p\naddress of t2.ch : %p\naddress of t2.iNum: %p\n\n", &t, &(t2.ch), &(t2.iNum)); 
  	printf("offset of ch in t2: %p\n", offsetof(Test2, ch)); 
  	printf("offset of iNum in t2: %p\n", offsetof(Test2, iNum)); 
  	
	return 0; 
  } 
  

  在VS2005中输出:

  address of t : 0012FF10

  address of t.iVal : 0012FF10

  address of t.iVal2: 0012FF14

  offset of iVal in t: 00000000

  offset of iVal2 in t: 00000004

  address of t2 : 0012FF10

  address of t2.ch : 0012FF00

  address of t2.iNum: 0012FF04

  offset of ch in t2: 00000000

  offset of iNum in t2: 00000004

  需要注意的是,Test2中iNum成员的偏移量是4而不是1,这涉及到C语言中内存对齐机制。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值