offsetof简介

简介: #define offsetof(s,m) (size_t)&reinterpret_cast((((s *)0)->m)) 该宏用于求结构体中一个成员在该结构体中的偏移量。第一个参数是结构体的名字,第二个参数是结构体成员的名字。

#define offsetof(s,m) (size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m))

该宏用于求结构体中一个成员在该结构体中的偏移量。第一个参数是结构体的名字,第二个参数是结构体成员的名字。该宏返回结构体structName s中成员memberName(m)的偏移量。偏移量是size_t类型的。

offsetof returns the offset in bytes of the specified member from the beginning of its parent data structure. It is undefined for bit fields.

示例

#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;
}

 

  wps_clip_image-31628

 

  注意内存对齐。

原文

http://www.cppblog.com/lovedday/archive/2007/09/24/32801.html

http://baike.baidu.com/view/5513779.htm

目录
相关文章
|
1月前
|
编译器 C语言
C语言:typedef 和 define 有什么区别
在C语言中,`typedef`和`#define`都是用来创建标识符以简化复杂数据类型或常量的使用,但它们之间存在本质的区别。`typedef`用于定义新的数据类型别名,它保留了数据类型的特性但不分配内存。而`#define`是预处理器指令,用于定义宏替换,既可用于定义常量,也可用于简单的文本替换,但在编译前进行,过度使用可能导致代码可读性下降。正确选择使用`typedef`或`#define`可以提高代码质量和可维护性。
|
5月前
|
安全 编译器 C语言
【C语言进阶篇】offsetof宏的介绍 及其实现
【C语言进阶篇】offsetof宏的介绍 及其实现
|
6月前
|
存储 Rust 开发者
【Rust】——结构体struct
【Rust】——结构体struct
|
6月前
用一行代码实现宏offsetof
用一行代码实现宏offsetof
|
6月前
|
C++
浅学指针(5)sizeof和strlen的进阶理解
浅学指针(5)sizeof和strlen的进阶理解
|
编译器 C语言 C++
【C语言】结构体与offsetof实现(上)
【C语言】结构体与offsetof实现
72 0
|
C语言 C++
【C语言】结构体与offsetof实现(下)
【C语言】结构体与offsetof实现(下)
74 0
|
C语言
C语言中typedef和define对比分析
C语言中typedef和define对比分析
101 0
Go 编程 | 连载 16 - 结构体 Struct
Go 编程 | 连载 16 - 结构体 Struct
|
自然语言处理 编译器 C语言
C语言入门与进阶——typedef与#define
C语言入门与进阶——typedef与#define
184 0
C语言入门与进阶——typedef与#define