当谈到C++/C
变量时,标准ISO文档会提及storage class
,storage duration
,file scope
,lifetime
,和linkage
。
我想了解基本线索以及它们如何相互关联。但在阅读ISO
文档后,我找不到这些概念的清晰逻辑图。
ISO documents
部分:
答案 0 :(得分:3)
存储类说明符是声明语法的
decl-specifier-seq
的一部分。它们控制声明引入的名称的两个独立属性:存储持续时间及其链接。 存储类说明符:
auto
- 自动存储持续时间(直到C ++ 11)register
- 自动存储时间。还提示编译器将变量放在处理器的寄存器中(不建议使用)static
- 静态或线程存储持续时间和内部链接extern
- 静态或线程存储持续时间和外部链接thread_local
- 线程存储持续时间(自C ++ 11起)存储持续时间:
automatic
存储时间。变量在封闭代码块的开头分配,并在末尾解除分配。所有非全局变量都具有此存储持续时间,但声明为static
,extern
或thread_local
的变量除外。static
存储时间。程序开始时分配变量,程序结束时分配变量。只存在一个变量实例。所有全局变量都具有此存储持续时间,以及使用static
或extern
声明的持续时间。thread
存储时间。线程开始时分配变量,线程结束时分配变量。每个线程都有自己的变量实例。只有声明为thread_local
的变量才具有此存储持续时间。thread_local
可与static
或extern
一起显示以调整关联。 (自C ++ 11起)dynamic
存储时间。通过使用动态内存分配函数为每个请求分配和释放变量。<强>联动即可。表示对象,引用,函数,类型,模板,命名空间或值的名称可以具有链接。如果名称具有链接,则它引用与另一个范围中的声明引入的相同名称相同的实体。如果在多个范围内声明了具有相同名称的变量,函数或其他实体,但没有足够的链接,则会生成该实体的多个实例。
以下链接得到承认:
- 无链接。该名称只能从其所在的范围引用。
- 内部链接。可以从当前翻译单元的所有范围引用该名称。
- 外部链接。该变量可以从其他翻译单元的范围引用。
答案 1 :(得分:0)
虽然我对这些概念有直观的理解,但我对他们的真实含义非常好奇;规则是什么以及为什么它们就是这样。
所以我写了一篇关于它的full blog post,这篇文章虽然没有成为标准,但却更加简单易懂。
以下是主要见解:
(C中的对象是变量或函数)
声明的范围是代码的一部分 声明被看到并可以使用。
请注意,这并未说明对象是否与之关联 声明可以通过代码的其他部分访问 另一个宣言!
我们通过其内存识别唯一对象:变量的存储 或功能代码。
持续时间表示与声明关联的对象 在整个程序的执行过程中持续存在(静态持续时间)或是否已分配 输入声明范围时动态(动态持续时间)。
链接是决定同一对象的多个声明的原因 引用相同的对象,或分开的对象。
关于链接,如果我们简化一下:
最后,一个方便的规则:
可以使用确定任何声明的链接和持续时间 只有三条规则(大多数先例规则优先):
在函数中,没有
extern
的声明没有链接。在函数中,没有
extern
或static
的声明具有自动持续时间。在任何范围内的任何其他声明都具有静态 持续时间。在编译单元中,如果存在具有
static
存储类说明符的声明,则对象具有内部链接。这个 声明必须在任何extern
声明之前发生 不能没有存储类说明符的任何声明(或者 编译错误随之而来)。否则,他们有外部联系。
我希望这有帮助!