Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2691603
  • 博文数量: 505
  • 博客积分: 1552
  • 博客等级: 上尉
  • 技术积分: 2514
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-23 18:24
文章分类

全部博文(505)

文章存档

2019年(12)

2018年(15)

2017年(1)

2016年(17)

2015年(14)

2014年(93)

2013年(233)

2012年(108)

2011年(1)

2009年(11)

分类: LINUX

2013-12-20 13:15:18

阅读内核源码kfifo时,有以下程序:
#define kfifo_free(fifo) \
({ \
        typeof((fifo) + 1) __tmp = (fifo); \
        struct __kfifo *__kfifo = &__tmp->kfifo; \
        if (__is_kfifo_ptr(__tmp)) \
                __kfifo_free(__kfifo); \
})

指针+1的操作,相当于取同类型下一个元素的地址,所以只有是指针才能正确,防止传进来的是数组。
例如:
 int a[4];
 typeof(a)   :   int [4]
 typeof(a+1):  int *
 
+1还可以预防宏调用时误传结构。
例如:
struct kfifo k;
kfifo_reset(&k); // 正确
kfifo_reset(k); //引发编译器错误,而不是到运行期coredump

所以typeof(x + 1)主要是用来检查传进来的参数确保是指针。
阅读(3649) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~