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

时间:2020-03-06 14:23:02  来源:igfitidea点击:

当有人谈论变量存储类说明符时,他们在说什么?
他们还经常在同一上下文中谈论变量链接,那是什么?

解决方案

存储类说明符控制变量的存储和链接。这是两个不同的概念。
C为变量指定以下说明符:自动,外部,寄存器,静态。

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

静态的
如果变量是在文件范围内声明的,或者使用extern或者static说明符声明,则它将具有静态存储空间。该变量将在程序执行期间一直存在。没有执行时间花费在创建这些变量上。

自动的
如果变量是在函数中声明的,但没有外部或者静态说明符,则它将具有自动存储功能。该变量仅在执行函数时存在。返回后,该变量将不再存在。自动存储通常在堆栈上完成。创建这些变量是一个非常快的操作(只需增加堆栈指针的大小即可)。

动态的
如果使用malloc(或者C ++中的新增功能),则使用动态存储。该存储将一直存在,直到我们拨打免费(或者删除)电话为止。这是创建存储的最昂贵的方法,因为系统必须动态管理分配和释放。

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

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

内部联系
该变量对文件中的所有功能(称为翻译单元)都是可见的,但其他文件将不知道该变量的存在。

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

这是一张根据说明符描述存储和链接特性的表

Storage Class   Function            File 
  Specifier        Scope              Scope  
-----------------------------------------------------
  none           automatic         static      
                 no linkage        external linkage

 extern          static            static
                 external linkage  external linkage

 static          static            static
                 no linkage        internal linkage

  auto           automatic         invalid
                 no linkage

register         automatic         invalid
                 no linkage

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

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