linux const,linux内核const.h文件解释

本文详细介绍了Linux内核头文件uapi/linux/const.h中处理常量宏的方法,特别是针对在汇编和C代码中通用的常量宏。文章通过AC(X,Y)和_AT(T,X)两个宏的实现,解释了如何在不同环境下正确处理常量后缀如UL和ULL。此外,还展示了_AT(T,X)在函数调用中的应用,帮助开发者更好地理解和运用这些内核级别的宏定义。
摘要由CSDN通过智能技术生成

文件路径: uapi/linux/const.h 文件内容如下: /* const.h: Macros for dealing with constants. */#ifndef _LINUX_CONST_H#define _LINUX_CONST_H/* Some constant macros are used in both assembler and * C code. Therefore we cannot annotate them alw

文件路径:

uapi/linux/const.h

文件内容如下:

/* const.h: Macros for dealing with constants. */

#ifndef _LINUX_CONST_H

#define _LINUX_CONST_H

/* Some constant macros are used in both assembler and

* C code. Therefore we cannot annotate them always with

* 'UL' and other type specifiers unilaterally. We

* use the following macros to deal with this.

*

* Similarly, _AT() will cast an expression with a type in C, but

* leave it unchanged in asm.

*/

#ifdef __ASSEMBLY__

#define _AC(X,Y)X

#define _AT(T,X)X

#else

#define __AC(X,Y)(X##Y)

#define _AC(X,Y)__AC(X,Y)

#define _AT(T,X)((T)(X))

#endif

#define _BITUL(x)(_AC(1,UL) << (x))

#define _BITULL(x)(_AC(1,ULL) << (x))

#endif /* !(_LINUX_CONST_H) */具体的就不翻译啦,大概就是说在有些常量宏同时在汇编和C代码中出现,这样会出现问题,所以就用这个文件中定义的宏对这类问题进行处理,这里处理的是UL, ULL这两个宏。在着重解释UL、ULL、_AC(X, Y)、_AT(T, X)。

这理的UL、ULL,就是常见的C语言常量后缀,比如什么L、U,大家应该见过。因为出现UL也会成为一常量宏,所以在此进行相关处理。

_AC(X, Y)的作用就是产生对应的X,但是在__ASSEMBLY__和非__ASSEMBLY下有所不同。在__ASSEMBLY__下直接反回X,在非__ASSEMBLY__下返回X与Y的拼接符号。

_AT(T, X)在此处的作用相当于函数调用,其中T可以为函数名或者函数指针,X为相应该的参数表,如下:

#include

#define _AT(T,X)((T)(X))

int func(int x)

{

printf("x = %d\n", x);

}

int main()

{

_AT(func, 1);//此处使用X为函数名,若为函数指针也类似。

}发现写博客可以加深理解咯,小伙伴们都来写吧。欢迎指正啦~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值