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相关的头文件中的定义 :)

  • 相关阅读:
    Quicksum -SilverN
    uva 140 bandwidth (好题) ——yhx
    uva 129 krypton factors ——yhx
    uva 524 prime ring problem——yhx
    uva 10976 fractions again(水题)——yhx
    uva 11059 maximum product(水题)——yhx
    uva 725 division(水题)——yhx
    uva 11853 paintball(好题)——yhx
    uva 1599 ideal path(好题)——yhx
    uva 1572 self-assembly ——yhx
  • 原文地址:https://www.cnblogs.com/QuLory/p/3011564.html
Copyright © 2011-2022 走看看