typecheck()简析

在看源码的时候看到了这个宏:
路径:include/linux/typecheck.h
 

点击(此处)折叠或打开

  1. /*
  2.   5 * Check at compile time that something is of a particular type.
  3.   6 * Always evaluates to 1 so you may use it easily in comparisons.
  4.   7 */
  5.   8 #define typecheck(type,x) \
  6.   9 ({ type __dummy; \
  7.  10 typeof(x) __dummy2; \
  8.  11 (void)(&__dummy == &__dummy2); \
  9.  12 1; \
  10.  13 })
linux 下有很多的变量名和函数名用 “__”开头,开始的时候看着这些心理总认为是畸形的代码,然后就一个字.烦,想远离它,认为它不是正宗的代码。但是,看的多了竟然也熟悉了。

这段代码是个宏定义,它的功能是检查输入的参数x是不是类型type。
检测的方法很巧妙,其实就是对比的方法,如果对比呢?
分别用type的x定义了一个各自的影子变量,由于type本身表示类型,所以用type可以直接定义出一个变量: type __dumy;
而x是一个变量的名字,需要先获取这个变量多对应的类型,使用typeof获取类型,然后再定义变量。 typeof(x) __dumy2;
接下来就是对比这两个影子变量了,“&”这个符号是表示获取变量的地址,这里的对比方法是对比这两个变量的地址是否相同,从字面意义上来看对比的是这两个变量的地址值是否相同,但是,要想完成这个对比首先需要这两个变量是同一个类型的,比如都是int型,或都是char型,否则不同类型的值是不能对比的,这里正是用了这个特性。至于对比的结果是否相同到不重要,重要的是他们是否属于同一类型,如果是不同的类型GCC就会报错或警告,这样就知道是否同类型了。至于如果是真的同类型,他们的大小值谁还会在乎呢?        
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值