博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Kernel学习】基础篇——01一些标准宏定义和文件include关系
阅读量:6289 次
发布时间:2019-06-22

本文共 1643 字,大约阅读时间需要 5 分钟。

先从最简单的宏定义学习学习;熟悉一下内核中的一些基本类型的定义,和代码风格

今天我们从stddef.h文件开始看:

1、include/linux/stddef.h

1 #ifndef _LINUX_STDDEF_H 2 #define _LINUX_STDDEF_H 3  4 #include 
5 6 7 #undef NULL 8 #define NULL ((void *)0) 9 10 enum {11 false = 0,12 true = 113 };14 15 #undef offsetof16 #ifdef __compiler_offsetof17 #define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)18 #else19 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)20 #endif21 #endif // 我们会注意到一些基本特点,比如 // 1、在宏定义前先有#undef, 这个可以防止一些重定义的 warnings; // 2、我们知道了两个bool变量对应的值,false为0, true为1; // 3、19行的相对结构体成员的定义很经典,首先是强制类型转换((TYPE *)0) , 对结构体成员进行取地址的时候得到了相对位置的偏移;最后得到的值转换为size_t类型; // 4、使用了条件编译的形势来定义offsetof宏,如果有gcc内置的__builtin_offsetof来定义的宏__compiler_offsetof,那么久使用后者来定义这个offsetof;
 

 

2、上面的文件明显调用了include/uapi/linux/stddef.h这个文件,该文件内容为:

#include 

3、在include/linux/compiler.h文件中根据条件会最终调用其他的gcc编译相关定义:

#ifdef __GNUC__#include 
#endif // 编译器相关的定义我们后续来分析,比较多了,今天暂且理清一下相关的调用关系;

4、在linux/compiler-gcc.h中会根据情况调用适当版本的宏定义:

如下调用了__GNUC__对应版本的,比如:linux/compiler-gcc4.h

97 #define __gcc_header(x) #x 98 #define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h) 99 #define gcc_header(x) _gcc_header(x)100 #include gcc_header(__GNUC__) // 1、 97行的定义将对应参数转换成字符串!比如: __gcc_header(linux)则得到 "linux" // 2、 98行的## 表示参数进行连接,如果x为4得到linux/compiler-gcc4.h // 3、 100行利用__GNUC__的值,#include进来了合适的文件,比如: #include "linux/compiler-gcc4.h"

5、linux/compiler-gcc4.h中有一些具体的定义,比如上面提到的__compiler_offsetof的宏定义:

#define __compiler_offsetof(a,b) __builtin_offsetof(a,b)

今天先将写到这里,后面我们继续详细分析compiler相关的头文件中的定义 :)

 

转载于:https://www.cnblogs.com/QuLory/archive/2013/04/10/3011564.html

你可能感兴趣的文章
Google MapReduce到底解决什么问题?
查看>>
CCNP-6 OSPF试验2(BSCI)
查看>>
Excel 2013 全新的图表体验
查看>>
openstack 制作大于2TB根分区自动扩容的CENTOS镜像
查看>>
Unbuntu安装遭遇 vmware上的Easy install模式
查看>>
几个常用的ASP木马
查看>>
python分析postfix邮件日志的状态
查看>>
Mysql-5.6.x多实例配置
查看>>
psutil
查看>>
在git@osc上托管自己的代码
查看>>
机器学习算法:朴素贝叶斯
查看>>
小五思科技术学习笔记之扩展访问列表
查看>>
使用Python脚本检验文件系统数据完整性
查看>>
使用MDT部署Windows Server 2003 R2
查看>>
Redhat as5安装Mysql5.0.28
查看>>
通过TMG发布ActiveSync
查看>>
Web服务器的配置与管理(4) 配置访问权限和安全
查看>>
点石成金:“硅业报国”不仅是理念
查看>>
联络中心演化的四个特征
查看>>
《SQL与关系数据库理论——如何编写健壮的SQL代码》》一1.4 原始模型回顾
查看>>