C程序生成过程,预编译(宏处理),编译,汇编,链接
链接属性:
1.外部链接。
2.内部链接,只在本翻译单元可见。
3.无链接。
作用域:
1.块作用域。
2.函数作用域。
3.文件作用域。
作用域和链接描述了标识符的可见性。存储器描述了标识符访问的对象的生存期。有四种存储期。
1.静态存储期,运行期间一直存在.
2.线程存储期,从声明到线程结束一直存在,使用关键字_Thread_local关键字,每个线程获得该变量的私有备份.
3.自动存储期.
4.动态分配存储期.
存储类别 | 存储期 | 作用域 | 链接 | 声明方式 |
自动 | 自动 | 块 | 无 | 块内 |
寄存器 | 自动 | 块 | 无 | 块内,使用关键字register |
静态外部链接 | 静态 | 文件 | 外部 | 所有函数外 |
静态内部链接 | 静态 | 文件 | 内部 | 所有函数外,使用关键字static |
静态无链接 | 静态 | 块 | 无 | 块内,使用关键字static |
声明在块或函数头中的任何变量都属于自动存储类别,为了更清楚的表达你的意图,(例如表明有意覆盖一个外部变量定义,或者强调不要把变量改为其他存储类别)可以显式使用auto关键字,
int main() { auto int plox; return 0; }
但是在C++兼容的程序用不要使用auto,语义不同,C++中auto表示变量类型自动推导。
register关键字声明的变量更多像是一种请求,编译器根据寄存器或最快可用内存的数量衡量请求,或者直接忽略请求,如果忽然了请求,那么寄存器变量就变成了自动变量,即使是这样,仍然不能获取变量的地址(寄存器没有地址)。
int main(void) { register int quick; return 0; }
动态内存使用malloc()函数申请,使用free()函数释放,需要手动管理。
restrict关键字允许编译器优化某部分代码,它只能用于指针,表明该指针是访问数据对象的唯一且初始的方式。restrict关键字有俩个读者,一个是编译器,该关键字告诉编译器可以自由假定一些优化方案。另外一个读者是用户,该关键字告知用户要使用满足restrict要求的参数。编译器不会检查用户是否遵循这一原则,但是无视它后果自负。