linux内核里面几个特殊的宏定义

本文深入探讨了C++中模板元编程的核心概念,包括如何使用预处理器宏(如BITS_TO_LONGS(nr),ALIGN(x,a)等)来实现代码复用和优化。通过实例解释了如何计算位操作结果转换为长整型数量(BITS_TO_LONGS(nr)),如何对变量进行对齐(ALIGN(x,a)),以及如何使用BUILD_BUG_ON_ZERO宏来检查条件是否为零。此外,文章还介绍了容器_of宏的功能,用于通过成员指针找到结构体指针。这些都是C++模板元编程中关键且实用的技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.BITS_TO_LONGS(nr)

#define BITS_PER_BYTE 8

define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))

#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))

DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))为DIV_ROUND_UP(nr, 32)

所以BITS_TO_LONGS(nr)为(nr + 31)/32,就是求nr数字是32的多少倍。


2.ALIGN(x,a)


#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1)

#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))

typeof(x)(a)表示用X的类型来重定义a,

然后算出X,以mask为掩码的上界数。

 计算a以size为倍数的上下界数:

 #define alignment_down(a, size) (a & (~(size-1)) )
#define alignment_up(a, size)   ((a+size-1) & (~ (size-1)))

注意size为2的n次方


3.#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))

该宏是用e来使函数在编译的时候判断能否继续编译进行,当e为0是,编译通过,当e为非0时非法语句,编译不通过。


4.#define container_of(ptr, type, member) ({ \
const typeof(((type *)0)->member) * __mptr = (ptr); \
(type *)((char *)__mptr - offsetof(type, member)); })

该宏通过已知tpye类型的结构体中的一个成员的指针,找到这个结构体的指针。该宏返回type类型结构体指针


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值