GNU C typeof

2023-05-16

typeof 是 GNU C 标准里特有的扩展,标准的 ISO C 并没有这个关键字,所以在编译的时候不能加任何 ISO 的 C 标准选项,否则会报错。使用时加入-std=gnu90 即 GNU 的标准即可。
typeof的作用类似与sizeof,区别在于sizeof是得到参数的大小而typeof则是推导出参数的类型。
typeof的参数可以是两种形式:表达式或类型。
如:typeof(int *) a,b;
等价于:
int *a,*b;
typeof构造中的类型名不能包含存储类说明符,如extern或static。但是typeof允许包含类型限定符,如const或volatile。
例如,下列代码是无效的,因为它在typeof构造中声明了extern:
typeof(extern int) a;
举一个linux内核代码例子
/* 
  * 选自 linux-2.6.7 内核源码 
  * filename: linux-2.6.7/include/linux/kernel.h 
  */   
#define min(x,y) ({ \  
     typeof(x) _x = (x); \  
     typeof(y) _y = (y); \  
     ( void ) (&_x == &_y);        \  
     _x < _y ? _x : _y; })  
这段比较大小的代码非常巧妙,前两句使用typeof将传递的x, y两个参数(也可能是表达式)重新定义为_x, _y两个变量,避免了直接宏展开出现 ++x 与 ++y 这样的式子在 _x < _y ? _x : _y 的比较使变量值增加两次,同时因为使用typeof的缘故而可以接受不同的数据类型(x, y需相同类型才可比较)。第三句用来检测x, y的数据类型,由于C语言中没有 typeof()==typeof() 这样的用法,这里巧妙的采用比较两变量地址的方法来检测类型,如果_x和_y的类型不一样,其指针类型也会不一样,2个不一样的指针类型进行比较操作,会抛出一个编译警告,达到检测地址的目的。由于这一句完全无意义,所以前面加 (void) 来忽略 statement with no effect 无效的语句 警告。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GNU C typeof 的相关文章

随机推荐

  • 自定义元件package时,元件的新建属性在原理图中无显示

    在制作元件package封装 xff0c 选择package type 封装为Heterogeneous xff0c 给元件新定义封装 xff0c 却在原理图中显示不了 在调出的编辑属性中没用选项 xff0c 无法更改数值 以至于自动分配标
  • 在Altium Designer中使用AUTOCAD快速制作元件封装

    笔者通过使用AutoCAD处理图形 xff0c 并将其导入Altium Designer中 xff0c 快速绘制元件封装 xff0c 省去算间距的时间 本例中以NPN管 B772 封装为SOT 89为例 xff1a 第一步 xff1a 使用
  • 飞思卡尔中出现NO TBDML Interface found

    1 xff0c 安装BDM的驱动器 xff0c 安装完成之后检查USBDM上的绿灯是否闪烁 xff0c 有时候驱承购安装之后 xff0c 但绿灯不亮 xff1b 2 xff0c 若绿灯不亮 xff0c 而且在电脑属性里面的驱动安装成功之后
  • ubuntu装RTL8111/8168B网卡驱动

    给本本装了ubuntu xff0c 结果被上网的问题搞疯了 表现为开机后有较小概率网卡能正常工作 xff08 这两天来N次能用的时候有2次 xff09 正常的时候网络连接信息显示都和win下一样 不能联网的时候网络信息上全部显示0 0 0
  • LabVIEW如何调用C#Winform

    界面交互并不是Labview的强项 xff0c 使用Labview创建UI时候总会受制于VI有限的控件 xff0c 有限的皮肤和有限的控件事件 而当需要实现UI的多文档的窗口 xff0c 窗口的浮动停靠 xff0c 动画等功能时还需要花很大
  • Intellij IDEA 社区版集成 Database Navigator 数据库管理工具

    Intellij IDEA 社区版集成 DB Navigator数据库管理工具 第一步 xff1a 打开IDEA xff0c Intellij IDEA gt Preferences gt Plugins 第二步 xff1a 在Plugin
  • LabVIEW类方法浏览器-Class Method Browser

    随着LabVIEW的类编程应用增多 xff0c 当打开较多的VI进行编辑时候 xff0c 添加该类对应的VI方法到程序后背板上操作显得繁琐 xff08 需要在Project浏览器或类浏览器或库浏览器中找到该类的方法VI xff0c 然后再拖
  • vue学习笔记—bootstrap+vue用户管理

    vue xff0c 读音view xff0c 简单易用的前端框架 特点如下 xff1a 1 一个mvvm的前端框架 xff0c 内部做好了html中dom对象和后台用js语言定义的变量的双向绑定 2 中国人尤雨溪维护的个人项目 xff0c
  • Mysql查询创建和导入操作

    如何安装 xff1a https www cnblogs com bigbrotherer p 7241845 html 登录 xff1a mysql uroot p 输入密码 xff1a xxxx 显示当前数据库 xff1a show d
  • Typescript日期Date如何做格式化字符串

    使用一个date fns format的库 安装npm i date fns save import format from 39 date fns format 39 const newdate 61 new Date console l
  • C#匿名类型和动态解析减少定义传输类模板

    C 作为强类型语言 xff0c 在序列化和反序列化 xff08 json xff09 场景中对字符串解析常常需要定义强类型模板 xff0c 造成编码上的繁琐 其实可以使用匿名类型和动态解析减少json序列化时候的数据模板定义 xff1b s
  • Sourcetree 克隆代码,将git@打头路径,写入URL显示无效路径的处理

    情景 xff1a 刚安装完sourceTree 点击 43 xff0c 进行Clone项目 xff0c 输入 git 64 195 178 10 181 datas sys git路径 xff0c 提示 无效路径 信息 处理方法 xff1a
  • docker安装samba,网络硬盘

    安装好docker之后可以安装 dperson samba 使用下面的语句 xff0c 创建默认的用户 docker run it name samba p 139 139 p 445 445 v home ftpserver smb mo
  • Linux下执行可执行文件提示:No such file or directory的解决方法

    最近在Linux下安装交叉编译链工具 xff0c 解压完成后执行却提示 xff1a No such file or directory 查了一下发现我是64位的Ubuntu系统但是执行的是32位程序 xff0c 缺少32位lib库所以无法执
  • C语言typeof详解

    typeof 是 GNU C 标准里特有的扩展 xff0c 标准的 ISO C 并没有这个关键字 xff0c 所以在编译的时候不能加任何 ISO 的 C 标准选项 xff0c 否则会报错 使用时加入 std 61 gnu90 即 GNU 的
  • S5PV210-uboot解析(二)-start.S解析

    start S解析 首先是头文件包含 include lt config h gt include lt version h gt if defined CONFIG ENABLE MMU include lt asm proc domai
  • MPV播放器快捷键

    MPV播放器快捷键 Location of user defined bindings config mpv input conf Lines starting with are comments Use SHARP to assign t
  • u-boot学习总结

    1 移植前准备 Ubuntu 配置ssh tftp nfs 烧写uboot前格式化SD卡 1 Unsupported SD reader 2 dev sdb is NOT identified Vmware出问题在控制面板 gt 程序和功能
  • setjmp和longjmp

    setjmp 和 longjmp 在C标准库 lt setjmp h gt 中 setjmp jmp buf j 必须首先被调用 它表示 使用变量 j 记录现在的位置 函数返回 0 longjmp jmp buf j int i 可以接着被
  • GNU C typeof

    typeof 是 GNU C 标准里特有的扩展 xff0c 标准的 ISO C 并没有这个关键字 xff0c 所以在编译的时候不能加任何 ISO 的 C 标准选项 xff0c 否则会报错 使用时加入 std 61 gnu90 即 GNU 的