Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。

实现方式:

  container_of(ptr, type, member) ;

其实它的语法很简单,只是一些指针的灵活应用,它分两步:

第一步,首先定义一个临时的数据类型(通过typeof( ((type *)0)->member )获得)与ptr相同的指针变量__mptr,然后用它来保存ptr的值。

第二步,用(char *)__mptr减去member在结构体中的偏移量,得到的值就是整个结构体变量的首地址(整个宏的返回值就是这个首地址)。

其中的语法难点就是如何得出成员相对结构体的偏移量?

通过例子说明,如清单1:

 1 #include <stdio.h>
 2 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
 3 #define  container_of(ptr, type, member) ({                      \
 4                       const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
 5                        (type *)( (char *)__mptr - offsetof(type,member) );})
 6 struct test_struct {
 7            int num;
 8           char ch;
 9           float f1;
10   };
11  int main(void)
12   {
13           struct test_struct *test_struct;
14           struct test_struct init_struct ={12,'a',12.3};
15           char *ptr_ch = &init_struct.ch;
16           test_struct = container_of(ptr_ch,struct test_struct,ch);
17           printf("test_struct->num =%d\n",test_struct->num);
18           printf("test_struct->ch =%c\n",test_struct->ch);
19           printf("test_struct->ch =%f\n",test_struct->f1);
20           return 0;
21   }

转载于:https://www.cnblogs.com/linhaostudy/p/7966081.html

contain_of宏定义相关推荐

  1. C++ #define(宏定义)的使用

    C++ 宏定义 #define命令是C++语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本. 宏定义的一般形式 #define <宏名& ...

  2. 如何用C语言改变宏定义的大小,C语言中宏定义使用的小细节

    C语言中宏定义使用的小细节 #pragma#pragma 预处理指令详解 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#p ...

  3. c 宏定义用法#define

    转自:https://blog.csdn.net/boring_wednesday/article/details/78756696 宏定义 语法     #define name Stuff #de ...

  4. C语言宏定义使用技巧

    写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性等等.下面列举一些成熟软件中常用得宏定义...... 1,防止一个头文件被重复包含 #ifndef COMDEF_H ...

  5. 【C语言】07-预处理指令;-宏定义

    预处理指令简介; 1,C在对源程序进行编译之前,会对一些特殊的预处理指令作解释,产生一个新的源程序,此过程叫做编译预处理.C在经过编译预处理之后才对新的源码进行通常的编译; 2,预处理以'#'开头,且 ...

  6. 巧用宏定义进行调试 (转)

    巧用宏定义进行调试 在进行程序设计时,有时我们往往不希望借住于调试工具(如:gdb, vc),而以输出调试信息的方式进行调试时,我们就可以借住于强大的宏定义来进行调试.    一.在GCC下的定义方法 ...

  7. python用海伦公式求面积_用带参数的宏定义,通过海伦公式求三角形的面积

    要求: 海伦公式: ,其中 ,a,b,c为三角形的三个边.定义两个带参数的宏,一个用来求p,另一个用来求s 题目分析: 首先,题目要求是通过输入三角形的三条边,输出三角形的面积.因为不是任意的三条边都 ...

  8. iOS 开发 高级:使用 宏定义macros (#,##,...,__VA_ARGS_)

    一直以来用宏定义#define也就是定义一些简单的常量,至多也就是定义一个函数,很少关注宏定义的用法.直到看到这样的代码: [cpp] view plaincopy #define PLAYSOUND ...

  9. IOS,十六进制颜色和RGB颜色的宏定义

    2019独角兽企业重金招聘Python工程师标准>>> 16进制颜色值宏定义. //调用NSString *str = model.Color; NSString *strColor ...

最新文章

  1. oc开发之block详解
  2. 关联查询取更新时间_数据分析之sql复杂查询
  3. OSI七层模型非专业简介
  4. CentOS7 install spark+ipython-nodebook
  5. Kudu : 删除了不存在的数据报错 status=Not found: key not found (error 0)
  6. DNS服务系列之二:DNS区域传送漏洞的安全案例
  7. 腾讯《王者荣耀》禁止未满12周岁用户充值;B站发布16款新品游戏;华为注册姚安娜商标被驳回|极客头条...
  8. SQL基础笔试题--(一)
  9. linux 如何起服务,如何修改Linux的服务的开启和关闭
  10. 哪一类功率放大电路效率最高_集成电路工艺之双极型工艺
  11. Stata:工具变量法(两阶段最小二乘法2SLS)——解决模型内生性
  12. 曾经爱过就是彼此的慈悲
  13. UWA DAY 2021 精彩盘点 | 35场技术议题掀起的思维浪潮
  14. selenium设置浏览器的大小和位置
  15. 小程序运营打包 遇到找不到game.json
  16. Unity2019.4—AnroidStudio—AndroidX接入SDK详细版
  17. Android根据输入法的状态隐藏和关闭输入法
  18. 计算机应用基础网络统考t4,华南理工大学2019秋-计算机应用基础_随堂练习
  19. lterator方法讲解
  20. 《时间的玫瑰》——但斌

热门文章

  1. 一 Storm 基础
  2. 天堂向左,六级考场向右
  3. 怎么用MYSQL分析财务数据_如何使用Mysql正确的处理财务数据
  4. Ubuntu10.10更新源
  5. 2019年山西计算机二级报名入口,2019年下半年山西省计算机二级考试教程:Web程序设计...
  6. leetcode算法题--摆动序列★
  7. vue refs v-for 使用注意
  8. 【HDU4507】恨7不成妻
  9. 《敏捷时代》作者访谈录
  10. Unable to instantiate application