栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

linux备忘-typeof高级用法

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

linux备忘-typeof高级用法

typeof 高级用法细节 基础用法 功能:

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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/312915.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号