曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4787|回复: 0
打印 上一主题 下一主题

typecheck

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2011-1-15 10:32:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
平台: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: 警告:比较不相关的指针时缺少类型转换
执行:
# ./typecheck
1
由编译输出信息可以看到,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; 就是宏的返回值。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-4 01:08 , Processed in 0.079735 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表