什么是变量的链接和存储说明符?

当有人谈论变量存储类说明符时,他们在谈论什么?
他们也常常在同一个环境中讨论变量链接,那是什么?

存储类说明符控制变量的存储链接 。 这是两个不同的概念。 C为变量指定以下说明符:auto,extern,register,static。

存储
存储持续时间决定了变量在ram中的存储时间。
存储持续时间有三种类型:静态,自动和动态。

静态的
如果您的变量在文件范围内声明,或者使用extern或静态说明符声明,则它将具有静态存储。 只要程序正在执行,变量就会存在。 没有花费执行时间来创建这些变量。

自动
如果变量是在函数中声明的,但没有 extern或static说明符,则它具有自动存储。 只有在执行函数时,该变量才会存在。 返回后,变量不再存在。 自动存储通常在堆栈上完成。 创建这些变量是一种非常快速的操作(只需按大小递增堆栈指针)。

动态
如果使用malloc(或C ++中的new),则使用动态存储。 此存储将一直存在,直到您调用free(或delete)。 这是创建存储的最昂贵方式,因为系统必须动态管理分配和释放。

连锁
Linkage指定谁可以查看和引用变量。 连锁有三种类型:内部连接,外部连接和无连接。

没有联系
此变量仅在声明它的位置可见。 通常适用于函数中声明的变量。

内部联系
该变量对文件中的所有函数(称为转换单元 )都是可见的,但其他文件不会知道它存在。

外部联系
该变量将对其他翻译单元可见。 这些通常被认为是“全局变量”。

下面是一个描述基于说明符的存储和链接特征的表

  存储类function文件 
  说明范围范围  
 -------------------------------------------------- ---
  没有自动静电      
                 无联动外部联动

 外部静态静电
                 外部联动外部联动

 静态静态静态
                 没有联系内部联系

  自动无效
                 没有联系

注册自动无效
                 没有联系

变量存储类或类型说明符(如volatile,auto和static)定义程序执行期间保存变量的方式/位置。 例如,函数中定义的变量通常保存在堆栈中,这意味着函数返回后它将丢失。 使用“static”关键字,可以强制编译器将数据段中的变量放入内存中,使变量内容在调用该函数之间保持不变。 “register”关键字将使编译器尽可能地将变量放入CPU寄存器中,这对于循环中的计数器等非常有用。但是,它并不能保证它实际上在寄存器中。

在此处阅读有关类型说明符的更多信