参考: C语言程序设计:现代方法 第18章 声明
变量存储类型
- auto : 只对属于块的变量有效, 具有自动存储期限, 块作用域并且无链接. auto 从来不明确的指明
- static : 可用与全局变量, 而不必考虑变量声明的位置. 在块作用域外面时, 说明变量具有内部链接, 而在外部时, 把变量的存储期限从自动的变成了静态的.
- extern : 可以使几个源文件共享一个变量. 其声明的变量具有静态存储期限, 作用域依赖于变量的声明,
- register : 其要求编译器把变量存储在cpu的寄存器中, 而不会像其他变量一样驻留在内存中. 要注意的是, 它只是一种请求, 编译器也可以把变量放在内存中, 一般在变量需要频繁的访问和更新时使用. 只对声明在块内的变量有效. 同时由于寄存器没有地址, 对此类型声明的变量使用 & 操作符是非法的. 即使编译器把变量放在内存中, 这一限制任然适用.
函数的存储类型
- extern : 说明此函数具有外部链接, 也就是允许其他文件调用此函数
- static : 说明函数是内部链接, 也就是只能在定义函数的文件内调用此函数, 如果不指明函数的存储类型,那么函数具有外部链接.
类型限制符
- const : 声明变量是只读的, 及在显示初始化后就不能更改变量的值.
- volatile : 使我们可以通知编译器, 程序中的某些数据是’'易变"的, "易变"是指在程序运行期间即使没有改变变量的值, 变量的值也可能会改变. 所以此限定符会通知编译器此变量每一次必须从内存中重新获取.
##restrict 关键字
概括的说,关键字restrict只用于限定指针;该关键字用于告知编译器,所有修改该指针所指向内容的操作全部都是基于(base on)该指针的,即不存在其它进行修改操作的途径;这样的后果是帮助编译器进行更好的代码优化,生成更有效率的汇编代码。
**参考:C99中的restrict关键字 **