内核中typeof关键字的详细

关于Linux内核中typeof关键字的详细解析:

 

1. 本质与作用

typeof是GCC扩展的编译时类型推导关键字(C标准未定义),内核中广泛用于:

 

获取表达式或变量的静态类型(编译阶段确定)

实现类型安全的宏和泛型编程

避免重复声明已知类型

2. 基本语法

typeof(expression) // 推导表达式类型

typeof(type) // 直接返回类型本身(冗余用法)

3. 内核典型应用场景

(1) 安全指针操作

// include/linux/compiler.h

#define WRITE_ONCE(x, val) \

    do { *(volatile typeof(x) *)&(x) = (val); } while (0)

通过typeof(x)确保写入值与变量x类型匹配

(2) 容器宏实现

// include/linux/kernel.h

#define max(x, y) ({ \

    typeof(x) _max1 = (x); \

    typeof(y) _max2 = (y); \

    (void) (&_max1 == &_max2); \ // 类型检查

    _max1 > _max2 ? _max1 : _max2; })

推导x和y的类型实现类型安全比较

(3) per-CPU变量声明

#define DEFINE_PER_CPU(type, name) \

    DEFINE_PER_CPU_SECTION(type, name, __percpu)

常与__percpu结合使用,如typeof(*ptr)获取per-CPU指针的基础类型

4. 与标准C的对比

特性 typeof (GCC扩展) C11 _Generic

实现阶段 编译时 编译时

语法复杂度 简单直观 需要显式类型映射

类型匹配 精确推导 需手动列出所有可能类型

内核使用频率 高频 低频

5. 底层实现原理

编译阶段行为:

GCC在语法分析阶段记录表达式的静态类型

直接替换为推导出的类型(不生成额外指令)

类型安全验证:

int a;

typeof(a) b; // 等价于 int b

typeof(&a) c; // 等价于 int *c 

6. 特殊用法示例

(1) 动态数组声明

void foo(int n) {

    typeof(int[n]) arr; // VLA(可变长度数组)

}

(2) 函数指针类型推导

int test_func(void);

typeof(test_func) *func_ptr; // 正确推导函数指针类型

(3) 结构体成员访问

struct mystruct { int val; } s;

typeof(s.val) tmp = 0; // tmp被推导为int类型

7. 调试与限制

编译警告:若类型不匹配会触发-Wtype-safety警告

限制:

不能推导void类型

在C++中需使用decltype替代

调试宏:

#define TYPEOF_PRINT(x) \

    printk(KERN_DEBUG "Type of " #x " is %s\n", __builtin_typename(typeof(x)));

8. 为什么内核偏爱typeof

与编译器深度结合:依赖GCC特性实现零成本抽象

类型安全:比裸指针转换更安全

代码简化:避免重复类型声明(如容器宏)

在阅读内核代码时,遇到typeof通常意味着:

 

该代码路径对类型敏感

可能存在泛型编程意图

需要关注编译时的类型检查机制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值