1 Star 0 Fork 11

xtellaris / linux-0.12-1

forked from 一辉从天 / linux-0.12-1 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
C代码阅读提示.md 1.59 KB
一键复制 编辑 原始数据 按行查看 历史
ultraji 提交于 2019-04-27 17:25 . 2019.04.27

C代码阅读提示

  1. volatile 关键字

    例如,在include/linux/kernel.h中有这样一行代码:

    volatile void do_exit(long error_code);

    这里其实是帮助编译器进行优化,对于do_exit()而言,它是永远都不会返回的。如果还将调用它的函数的返回地址保存在堆栈上的话,是没有任何意义的。但是加了volatile过后,就意味着这个函数不会返回,就相当于告诉编译器,我调用后是不用保存调用我的函数的返回地址的。这样就达到了优化的作用。这种优化来源于gcc,在gcc2.5版本以后,使用noreturn属性来做优化,原代码等同于void do_exit(int error_code) __attribute__((noreturn));,但是在gcc2.5的版本以前,没有noreturn属性。

  2. 字符串用法

    例如,在fs/namei.c中有这么一行代码:

    #define ACC_MODE(x) ("\004\002\006\377"[(x) & O_ACCMODE])

    上面宏中右侧表达式是访问数组的一种特殊使用方法。它基于这样的一个事实,即用数组名和数组下标所表示的数组项(例如a[b])的值等同于使用数组首指针(地址)加上该项偏移地址的形式的值*(a+b),同时可知项a[b]也可以表示成b[a]形式。因此对于字符数组项形式为"LoveYou"2就等同于*("LoveYou" + 2)。另外,字符串"LoveYou"在内存中被存储的位置就是其地址,因此数组项"LoveYou"[2]的值就是该字符串索引值为2的字符"v"。

    例 "LoveYou"[2] = 2["LoveYou"] = *("LoveYou"+2)= 'v'

C
1
https://gitee.com/xtellaris/linux-0.12-1.git
git@gitee.com:xtellaris/linux-0.12-1.git
xtellaris
linux-0.12-1
linux-0.12-1
master

搜索帮助