栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言程序设计 | offsetof宏的讲解及其模拟实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言程序设计 | offsetof宏的讲解及其模拟实现

offsetof宏讲解

首先来看下在cpluscplus对于offsetof宏给出的定义

macro代表的是宏

其中参数有两个

  • type代表的是类型
  • member代表的成员

该宏的作用是用来求出结构体成员相对于首地址的偏移量。

使用的方法如下,代码实例:

struct S
{
	char c1;
	int i;
	char c2;
};

#include 
#include 
int main()
{
	struct S s = {0};
	printf("%dn", offsetof(struct S, c1));
	printf("%dn", offsetof(struct S, i));
	printf("%dn", offsetof(struct S, c2));

	return 0;
}

打印结果:

讲解:

模拟实现offsetof宏

在讲解中,我们可以看出,偏移量就是地址减去首地址的出来的一个数,那么我们假设地址为0,我们只需要取出地址,这个地址就是偏移量。

代码实例:

#include 
#include 
struct S
{
	char c1;
	int i;
	char c2;
};

#define OFFSETOF(type, m_name)    (size_t)&(((type*)0)->m_name)

int main()
{
	struct S s = {0};
	printf("%dn", OFFSETOF(struct S, c1));
	printf("%dn", OFFSETOF(struct S, i));
	printf("%dn", OFFSETOF(struct S, c2));

	return 0;
}

讲解:

首先我们把地址设为0,那么就有:

#define OFFSETOF(type,m_name)           ((type*)0)

这里呢就是地址设置为0,类型为type*类型的,注意这里的type只是进行替换,并不代表实际的类型

取出地址之后呢,我们就去找结构体的成员,那么就有:

#define OFFSETOF(type,m_name)            (((type*)0)->m_name)

这里找到结构体的成员之后,我们再取出这个成员的地址,那么就有:

#define OFFSETOF(type,m_name)            &(((type*)0)->m_name)

取出地址之后呢,我们再进行类型的强制转换。

#define OFFSETOF(type,m_name)   (size_t)(&(((type*)0)->m_name))

打印结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1030799.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号