volatile :
1,该关键字只是在编译时指使 编译器 作出相应动作;而非运行时作怪;
2,指示编译器,不必作出多余的优化: 对于已经存入寄存器当中的变量作访问时,使用volatile会在编译得到的指令当中增加 访问内存的 部分; 即,当访问处于寄存器变量时,都是去主存获取当前最新的数据;
3,与cache一致性无关; cache一致性由硬件维护;
4,Useful link : Do you volatile? Should you? - Linux For Devices Articles - Linux for Devices
extern :
1,不懂,属于原来C语言没学好的一类;
2,函数自身都是extern type;
3,变量 以在函数内/外为界,定义为 内部或者外部变量;在函数外定义的变量为外部变量,作用域为定义开始处到文件结尾;如果在定义处之前的代码/函数中使用该变量var,先使用extern var 声明即可;
4,编译器编译时遇到extern var, 先在本文件当中搜寻变量的定义;如果未找到,“会在链接时在其余文件当中搜索”。。。(最后这句引用,我觉得编译时是否就可以完成的啊,为毛链接时再去找呢,链接时工作应该是地址空间的变动和计算,这时还要费力去首先判断一个变量是否存在?不懂。。)
static :
1,在函数内定义时,其余函数不能引用,因为是函数内部的局部变量;
2,在函数外定义时,该变量虽是外部变量,但是作用域只能局限于本文件当中,其余文件中代码不得通过 extern 来引用;
3,关于extern 或者 static 详情, 可咨询 K&R那本大作;