存储类别

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要求的参数。编译器不会检查用户是否遵循这一原则,但是无视它后果自负。

原文地址:https://www.cnblogs.com/shuiyonglewodezzzzz/p/10970982.html