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两个变量,同时因为使用typeof的缘故而可以接受不同的数据类型(x, y需相同类型才可比较)。第三句用来检测x, y的数据类型,由于C语言中没有 typeof()==typeof() 这样的用法,这里巧妙的采用比较两变量地址的方法来检测类型,如果_x和_y的类型不一样,其指针类型也会不一样,2个不一样的指针类型进行比较操作,会抛出一个编译警告,达到检测地址的目的。由于这一句完全无意义,所以前面加 (void) 来忽略 statement with no effect 无效的语句 警告
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言typeof详解 的相关文章

随机推荐

  • 路漫漫其修远兮

    人类的知识恰似沧海一粟 xff0c 而某一人类个体犹如沧海一粟 大部分人也会有种假象 xff1a 人类现在全能全知 xff0c 上天入地无所不能 xff1b 甚至会认为这就是我们生活的世界 xff0c 我们完全明晰工作原理 世界是未知的 x
  • UCOSII--操作系统家族中的麻雀 前言与自嘲

    平凡的2013年随风逝去 xff0c 泛起的波纹还未抚平 时间总是这样当还未到达时 xff0c 总给人时间充裕的假象 xff0c 而当望着它的背影是却不时地感叹白驹过隙 太多的记忆是那么的刻骨铭心 xff0c 太多的时间从指间流走 xff0
  • UCOSII中的任务切换原理介绍

    1 多任务的引入 之所以引入多任务 xff0c 主要在于提高程序运行的效率 多任务的过程 xff0c 能够有效地发挥交换式任务的运作效率 类似的 xff0c 由于一个任务里面也有瓶颈的地方 xff0c 为了把瓶颈的地方抠出来 xff0c 让
  • ADI公司器件Pspice模型导出原理图symbol

    用于仿真的Pspice模型 xff0c 需要从ADI公司网站下载模型文件 xff0c 格式为 cir 不同于 mod文件 xff0c cir文件导出的管脚与原理图管脚不匹配 xff0c 刚开始会有点无从下手 我自己也是纠结了很长时间 xff
  • Capture到Allegro按页摆放遇到的小问题以及解决办法

    笔者利用网上的方法 xff0c 一遍遍的尝试 xff0c 一遍遍的不行 xff0c 自己定义的user defined property始终在Allegro中找不出来 作为新手 xff0c 纠结了半天 xff0c 甚是郁闷 xff0c 最终
  • 自定义元件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 的