热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

typeof、offsetof、container_of

typeof用于获取一个对象的类型,比如:unsignedinta1;typeof(a)isunsignedintshortb2;typeof(b)isshortoffsetof#
 

typeof

用于获取一个对象的类型,比如:

unsigned int a = 1; // typeof (a) is unsigned int 
short b = 2;        // typeof (b) is short

offsetof

#define offsetof(TYPE, MEMBER)  ((size_t)&((TYPE *)0)->MEMBER)

获取某个成员变量(MEMBER)在其所在的结构体(TYPE)里的偏移:

  1. 首先将地址0强行转换为 TYPE * 类型
  2. 再将此对象中的MEMBER取地址后,强制转化为size_t格式返回

因为该对象的起始地址为0,那么MEMBER处的地址自然是其在此结构体中的偏移地址。

container_of

// non ISO variant from linux kernel; checks ptr type, but triggers ‘ISO C forbids braced-groups within expressions [-Wpedantic]‘
//  __extension__ is here to disable this warning
#define container_of(ptr, type, member)  ( __extension__ ({             const typeof( ((type *)0)->member ) *__mptr = (ptr);            (type *)( (char *)__mptr - offsetof(type,member) );}))

它的作用是根据一个结构体成员的地址来获取该结构体的地址:

  1. typeof( ((type *)0)->member ) 就是获取type->member的数据类型,并用该类型创建一个const 的指针  __mptr 
  2. __mptr的地址是传入的数据结构体成员的地址
  3. 把__mptr的地址强制转为(char *)的地址,然后再减去它在结构体中的偏移地址,不就是此结构体的地址了嘛
  4. 最后将此地址再强制转换为它本来的类型:type

typeof、offsetof、container_of


推荐阅读
  • 本文详细介绍了如何在VMware环境下安装CentOS 7 Minimal,并成功配置GNOME桌面环境的过程。包括解决网络连接问题和设置默认图形界面等关键步骤。 ... [详细]
  • Linux环境下Memcached安装指南
    本文详细介绍如何在Linux虚拟机上安装Memcached,包括必要的依赖库安装,以及使用Xshell进行文件传输的具体步骤。 ... [详细]
  • 学习目的:1.了解android线程的使用2.了解主线程与子线程区别3.解析异步处理机制主线程与子线程:所谓主线程,在Windows窗体应用程序中一般指UI线程,这个是程序启动的时 ... [详细]
  • 使用Inno Setup将EXE与JRE封装为Windows安装程序
    本文详细介绍了如何利用Inno Setup工具将EXE文件及Java运行环境(JRE)整合为适用于Windows操作系统的安装程序。我们将提供必要的软件下载链接,并逐步指导您完成整个打包过程。 ... [详细]
  • 本文详细介绍了如何在VUE开发环境中正确安装和配置Nightwatch及Karma相关插件,并解决运行测试时遇到的Java版本不兼容问题。 ... [详细]
  • 本文介绍了在 Android 开发中如何实现像素 (px)、缩放独立像素 (sp) 和密度独立像素 (dp) 之间的相互转换。这些方法对于确保应用在不同屏幕尺寸和分辨率上的适配至关重要。 ... [详细]
  • 本文提供了中国三大主要通信运营商(中国联通、中国电信和中国移动)的官方邮箱服务网站链接,帮助用户快速访问并管理个人邮件,同时介绍了如何设置短信提醒功能。 ... [详细]
  • 矩阵交织技术详解
    本文介绍了矩阵交织的工作原理及其在通信系统中的应用。交织技术通过对信息码元的重新排列,能够在不增加编码冗余度的情况下,提升系统的突发错误检测能力,从而增强整体性能。 ... [详细]
  • 本文旨在介绍Three.js的基础概念及其应用场景。Three.js是一个基于WebGL的JavaScript库,用于在网页上创建和显示3D图形。文中将从Canvas的基本功能出发,探讨其局限性,并引出WebGL及Three.js的解决方案。 ... [详细]
  • 本文介绍了一个简单的Python函数,该函数能够接收一个日期作为输入,并返回这一天是星期几。此功能通过使用Python的datetime模块实现。 ... [详细]
  • 本文探讨了Tomcat在启动过程中遇到的‘严重: Null组件’警告,并提供了解决此问题的方法,特别是当Tomcat使用的JRE版本低于应用所需版本时的处理方案。 ... [详细]
  • 深入理解FastDFS
    FastDFS是一款高效、简洁的分布式文件系统,广泛应用于互联网应用中,用于处理大量用户上传的文件,如图片、视频等。本文探讨了FastDFS的设计理念及其如何通过独特的架构设计提高性能和可靠性。 ... [详细]
  • 在现代多线程编程中,Lock接口提供的灵活性和控制力超越了传统的synchronized关键字。Lock接口不仅使锁成为一个独立的对象,还提供了更细粒度的锁定机制,例如读写锁(ReadWriteLock)。本文将探讨如何利用ReentrantReadWriteLock提高并发性能。 ... [详细]
  • 无脚本 JSP 的 Web 页面设计
    探讨了Web页面设计人员是否需要掌握Java技能,以及他们如何快速学习表达式语言(EL)。虽然EL的应用前景尚不明朗,但本文将重点介绍如何通过JSP的include指令有效整合页面元素。 ... [详细]
  • 本文深入探讨了Java注解的基本概念及其在现代Java开发中的应用。文章不仅介绍了如何创建和使用自定义注解,还详细讲解了如何利用反射机制解析注解,以及Java内建注解的使用场景。 ... [详细]
author-avatar
薛薛Sying
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有