Linux宏:__ASSEMBLY__
2024-10-06 00:19:26
汇编:assembly
猜测:所以这个宏跟汇编有关?!
引用:某些常量宏会同时被C和asm引用,而C与asm在对立即数符号的处理上是不同的。asm中通过指令来区分其操作数是有符号还是无符号的,而不是通过操作数。而C中是通过变量的属性,而不是通过操作符。C中如果要指明常量有无符号,必须为常量添加后缀,而asm则通过使用不同的指令来指明。如此,当一个常量被C和asm同时包含时,必须做不同的处理。故KBUILD_AFLAGS中将添加一项D__ASSEMBLY__,来告知预处理器此时是asm。
/* linux-3.08/include/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.
*/
/*
* 上边的注释说:一些常量宏同时在汇编和C中使用,然而,我们不能像注释C的常量宏那样加一个“UL”或其他后缀。所以我们需要使用以下的宏解决这个问题。
* 例如调用:#define DEMO_MACRO _AT(1, UL):在C中会被解释为 #define DEMO_MACRO 1UL; 而在汇编中什么都不做,就是: #define DEMO_MACRO 1
*/
#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 #endif /* !(_LINUX_CONST_H) */
最新文章
- QTP参数化
- js数组方法push pop shift unshift的返回值
- SeedDms 文档管理系统安装
- iOS 中使用Block时需要注意的retain circle
- oracle 存储过程基础
- HTTP协议(待完善)
- linux常用命令:1文件处理命令
- OpenCV -- 获取轮廓照片
- Hdu3640-I, zombie(模拟+二分)
- BZOJ 2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛( dp )
- WPF之DatePicker使其只能选择日期,不能输入日期
- Android笔记: 在Eclipse环境下使用Genymotion模拟器
- 基于 xorm 的服务端框架 XGoServer
- 开源ERP-成功案例分析(3)
- __x__(47)0910第六天__IE6到IE11对于包含中文路径的png显示问题
- windows Apache服务器简单配置虚拟域名(转载)
- python 全栈开发,Day46(列表标签,表格标签,表单标签,css的引入方式,css选择器)
- Oracle导入的常见语句
- Java设计模式学习记录-建造者模式
- Caused by: java.lang.IllegalStateException: Method has too many Body parameters