typeof 高级用法细节
基础用法
功能:
typeof用于获取参数“param”的类型
typeof(param)
基本用法
/**定义一个int型变量a**/
int a;
/**定义一个与a类型一样的变量b**/
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; \
})
关注以下用法
/**备注:fifo是一个结构体指针**/
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