实现宏offsetof()

实现宏offsetof()_第1张图片

本期介绍

主要介绍:什么是offsetof(),offsetof()的用法,如何自己实现这个宏。


  offsetof其实是一个宏,作用是:能够求出指定成员相对于结构体起始地址的偏移量(单位:字节byte)。大部分C语言初学者在看见offsetof都会下意识的认为它是一个函数,这也不怪它们,因为宏命名约定的是全大写。

定义类型:size_t offsetof(type, m_name)

  其中,参数type可以是结构体类型,也可以是结构体名;参数m_name是需要求偏移量的结构体成员名。宏offsetof()的返回类型为size_t,即unsigned int类型。在使用offsetof()前需要先引用头文件。下面是案例:

#include

struct S
{
	char a;
	int b;
	float c;
};

int main()
{
	printf("%d\n", offsetof(struct S, a));
	printf("%d\n", offsetof(struct S, b));
	printf("%d\n", offsetof(struct S, c));
	return 0;
}

实现宏offsetof()_第2张图片

  相信有些同学会不理解这里的结果,或者甚至都没有听说过结构体还有什么偏移量的,这就要说到结构体内存对齐了。我曾今讲述过,这是链接:结构体内存对齐。


  上面我们了解了什么是offsetof(),以及它的用法,下面我们就来尝试一下自己实现这个宏。首先,我们知道宏有两个参数(结构体名,成员名),那怎么通过这两个参数求偏移量呢?很简单,由于&结构体名求的就是结构体起始位置的地址,故我们只要用成员变量的地址减去起始位置的地址,就可以算出成员的偏移量了。如下图所示:

实现宏offsetof()_第3张图片

#define OFFSETOF(type, name_m) (size_t)&(((type*)0)->name_m)
//将0地址设置为结构体的起始地址,然后取成员变量的地址,就是该成员的偏移量

struct S
{
	char a;
	int b;
	float c;
};

int main()
{
	printf("%d\n", OFFSETOF(struct S, a));
	printf("%d\n", OFFSETOF(struct S, b));
	printf("%d\n", OFFSETOF(struct S, c));
	return 0;
}

实现宏offsetof()_第4张图片


实现宏offsetof()_第5张图片

这份博客如果对你有帮助,给博主一个免费的点赞以示鼓励欢迎各位点赞评论收藏⭐️,谢谢!!!
如果有什么疑问或不同的见解,欢迎评论区留言欧。

你可能感兴趣的:(c语言,开发语言)