typeof用于获取参数“param”的类型
typeof(param)基本用法
int a; typeof(a) b;高级用法 先说结论
当typeof 对象想要的是指针时推荐使用加1操作,即“typeof((a)+1)”,这样当传入非指针时引发编译错误
举例说明详情请参考kernel源码kfifo实现。
看个高级用法的例子:
#define kfifo_reset(fifo)
(void)({
typeof((fifo) + 1) __tmp = (fifo);
__tmp->kfifo.in = __tmp->kfifo.out = 0;
})
关注以下用法
typeof((fifo) + 1) __tmp = (fifo);
很明显作者是想要定义一个与fifo类型一样的变量__tmp。
我们正常的做法是
typeof(fifo) __tmp = (fifo);
区别在于是否有+1的操作。
解析对代码进行解析。
fifo+1:fifo为指针,指针+1为偏移到指针指向类型大小的地址。fifo不为指针,则执行+1运算,当fifo为结构体引发编译错误
typeof((a) + 1) 用于保证传递进来的变量a为指针,若不为指针则引发编译错误,而不是等运行时造成不可预估的后果。
typedef struct TEST_
{
int a;
int b;
}TEST_T;
TEST_T tTest;
typeof((&tTest) +1) b; //等效于TEST_T *b
typeof((&tTest)) b;//等效于TEST_T *b
!!!但是假如误传非指针则
typeof((tTest) +1) b; //报错,结构体变量不能+1
typeof(tTest) b; //不报错,等效于TEST_T b



