平台:x86
内核:2.6.24
typecheck 宏用来检查一个变量的类型,它定义在 include/linux/Kernel.h 中,代码如下:
[Plain Text] 纯文本查看 复制代码 /*
* 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; \
})
从注释可以知道,该宏可以在编译阶段检查出类型的匹配问题且它总是返回 1。
可以用一个应用程序来分析该宏:
#include <stdio.h>
#define typecheck(type,x) \
({ type __dummy; \
typeof(x) __dummy2; \
(void)(&__dummy == &__dummy2); \
1; \
})
int main()
{
int i = 18;
printf ("%d\n", typecheck (unsigned long, i));
return (0);
} 编译输出:# gcc typecheck.c -o typecheck
typecheck.c: In function ‘main’:
typecheck.c:14: 警告:比较不相关的指针时缺少类型转换 执行:由编译输出信息可以看到,int 型和 unsigned long 型在比较时发生了类型不匹配警告,而宏的输出结果为 1 。
这个宏的比较过程是这样的:
宏的第 1 个参数是一个 C 内置数据类型,第 2 个参数是某一类型的变量,所以:
[Plain Text] 纯文本查看 复制代码 type __dummy;
是用第一个参数的类型来定义一个 __dummy 变量,如上面程序里,__dummy 的类型被定义为 unsigned long 型。
[Plain Text] 纯文本查看 复制代码
typeof(x) __dummy2;
typeof(x) 是利用 typeof (gcc 的一个内置操作数,为获取特定变量的类型) 获得第 2 个参数的类型,如上面程序里是 int 型。然后用这个类型定义了第 2 个变量 dummy2 。
[Plain Text] 纯文本查看 复制代码 (void)(&__dummy == &__dummy2);
分别取得 __dummy 和 __dummy2 变量的首地址,也就是它们两的个子指针。我们正是通过对指针的比较从而知道类型是否匹配的。
最后一跳语句 1; 就是宏的返回值。 |