zoukankan      html  css  js  c++  java
  • 【Kernel学习】基础篇——01一些标准宏定义和文件include关系

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

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

    1、include/linux/stddef.h

     1 #ifndef _LINUX_STDDEF_H
     2 #define _LINUX_STDDEF_H
     3 
     4 #include <uapi/linux/stddef.h>
     5 
     6 
     7 #undef NULL
     8 #define NULL ((void *)0)
     9 
    10 enum {
    11     false    = 0,
    12     true    = 1
    13 };
    14 
    15 #undef offsetof
    16 #ifdef __compiler_offsetof
    17 #define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)
    18 #else
    19 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
    20 #endif
    21 #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 <linux/compiler.h>

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

    #ifdef __GNUC__
    #include <linux/compiler-gcc.h>
    #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相关的头文件中的定义 :)

  • 相关阅读:
    第三次博客园作业
    centos7+jdk1.8+tomcat8 配置https
    输入30个数存入数组a,求出数的每个位数的平方和存入数组b,从小到大排列后输出(C语言)
    50个[100,300]的随机数,要求用二分法查找从键盘录入的关键数字。找到回复位置,找不到回复不存在(C语言)
    产生20个随机数,在[200,400]内,其中能被5整除的存入数组array2,要求输出array2中的平均值(C语言)
    最小生成树
    PTA路径判断
    PTA构造哈夫曼树
    图的其中两种表示方式
    中序遍历树并判断是否为二叉搜索树
  • 原文地址:https://www.cnblogs.com/QuLory/p/3011564.html
Copyright © 2011-2022 走看看