好记性不如铅笔头

kernel, linux, 操作系统

typecheck简单解析

本文参考【 http://blog.chinaunix.net/uid-10769062-id-3830838.html 】,有删改。

typecheck

/*
 * Check at compile time that something is of a particular type.
 * Always evaluates to 1 so you may use it easily in comparisons.
 */
#define typecheck(type,x) \
({	type __dummy; \
	typeof(x) __dummy2; \
	(void)(&__dummy == &__dummy2); \
	1; \
})

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

Leave a Reply

2 × 2 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据