linux备忘-typeof高级用法

4 篇文章 1 订阅
3 篇文章 0 订阅

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
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值