当前位置: 首页 > news >正文

海口企业网站建设关键词优化排名软件哪家好

海口企业网站建设,关键词优化排名软件哪家好,做网站 需求,网站建设推广优化排名container_of 宏 今天遇到了一段这样的代码,大致意思是 通过该struct结构体变量的成员的地址来反推该struct结构体变量的地址 并且用到了内核的宏,container_of() static inline struct nova_inode_info *NOVA_I(struct inode *inode) {return container…

container_of 宏

今天遇到了一段这样的代码,大致意思是 通过该struct结构体变量的成员的地址来反推该struct结构体变量的地址

并且用到了内核的宏,container_of()

static inline struct nova_inode_info *NOVA_I(struct inode *inode)
{return container_of(inode, struct nova_inode_info, vfs_inode);
}

查了查该宏位于include/linux/kernel.h文件

功能:由结构体变量的某个成员变量的内存地址来得到该结构体变量的内存地址

参数:

  1. 该结构体成员变量的地址(指针)

    2. 该结构体的定义类型(type)
    3. 该结构体成员的变量名()
    

具体实现:

#define container_of(ptr, type, member) ({                      \const typeof( ((type *)0)->member ) *__mptr = (ptr);    \(type *)( (char *)__mptr - offsetof(type,member) );})

原理:

  1. 用到GCC的typeof预处理语句,typeof(x),返回参数x的类型
  2. 用到了offsetof(type,member),由一个结构成员member,得到相对于结构开头的字节偏移量 .在<stddef.h>

container_of()做了两步.

  1. 模拟该结构体变量指针指向成员然后通过typeof()反推成员的数据类型,const typeof( ((type *)0)->member),然后定义一个该成员变量类型的指针(就是ptr的数据类型)const typeof( ((type *)0)->member) *__mptr = (ptr)
  2. __mptr转换为char *,按照1个字节计算,__mptr减去成员偏移量就是结构体变量的基地址了。再将该地址(指针)转换为type指针
  3. 最后表达式返回的是 (type *) (结构体变量基地址) 指针
1. const typeof( ((type *)0)->member) *__mptr = (ptr)
2. (char *)__mptr - offsetof(type,member)

测试:

#include <stdio.h>
#include <stddef.h>#define everything_to_string(x) #x 
/*
#define container_of(ptr,type,member) ({ \const typeof( ((type *)0)->member ) *__mptr = (ptr); \(type *)( (char *)__mptr - offsetof(type,member) );})
*/
//const struct member *__mptr=ptr;
//(struct Student *)( (char *)__mptr - offsetof(type,member) ) 
#define container_of(ptr,type,member) ({ \const typeof( ((type *)0)->member ) *__mptr = (ptr); \(type *)((char *)__mptr - offsetof(type,member)); })struct info {int a;int b;
};
struct Student {char name[4]; // 0int age;      // 4int grade;    // 8int sex;      // 12struct info last;
};int main()
{struct Student student={"123",22,100,1,{10,20}};struct info *ptr=&student.last;struct Student *pstudent = container_of(ptr,struct Student,last);printf("[%p]\n",pstudent);printf("[%p]\n",ptr);return 0;
}

参考资料

  1. https://stackoverflow.com/questions/15832301/understanding-container-of-macro-in-the-linux-kernel
  2. https://gaomf.cn/2017/10/07/C_typeof/
  3. https://www.runoob.com/cprogramming/c-macro-offsetof.html
http://www.khdw.cn/news/43980.html

相关文章:

  • 呼和浩特建设委员会网站厦门谷歌推广
  • 一个动态网站的制作流程网站查询平台
  • 做网站栏目是什么意思旅游app推广营销策略
  • 手机端网站开发教程重庆网站seo教程
  • 佛山网站seo优化自己如何注册网站
  • 做六合彩网站销售crm客户管理系统
  • 新网站上线怎么做seo有效果的网站排名
  • 做网站有用没长沙营销推广
  • 专门做网页设计网站谷歌ads广告投放
  • 企业网站建设框架徐州网站设计
  • 外贸商做英文网站的目的seo搜索
  • discuz企业网站企业网络营销策略案例
  • 网站建设案例新闻seo关键词如何设置
  • 网站域名要钱吗新榜数据平台
  • 沈阳营销网站制作企业百度排名点击软件
  • 完善网站建设搜索引擎优化方法有哪些
  • 自己做外贸网站seo搜狗排名点击
  • 2018年做网站赚钱吗成都疫情最新情况
  • 建设部领导干部官方网站央视新闻
  • 网站建设的合同书宁波网站优化公司价格
  • 母婴网站建设企业培训机构
  • 做网站如何赢利的广州网页搜索排名提升
  • 怎么做网站内部链接的优化武汉企业seo推广
  • 适合个人做的网站b站推广引流最佳方法
  • 大连企业做网站百度推广投诉电话客服24小时
  • 国际摄影作品网站网页自动点击软件
  • 怎么修改网站排版什么平台可以打广告做宣传
  • 平面设计必学软件福建seo
  • 网站推广服务域名关键词排名查询
  • 网站视频接口 怎么做发软文的平台