2

当谈到C++/C变量时,标准 ISO 文档提到storage classstorage durationfile scopelifetimelinkage

我想了解基本线索以及它们之间的关系。但是在阅读ISO文档后,我找不到这些概念的清晰逻辑图。

你能帮忙澄清一下吗?我希望我可以使用那里的概念来分析我的编程问题。

ISO documents部分:

  • C99 6.7.1 存储类说明符
  • C99 6.11.2 标识符的链接
  • C++2003 7.1.1 存储类说明符
  • C++2003 7.5 链接规范
  • 等等
4

2 回答 2

4

存储类说明符是decl-specifier-seq声明语法的一部分。它们控制声明引入的名称的两个独立属性:它们的存储持续时间和它们的链接存储类说明符:

  • auto- 自动存储持续时间(直到 C++11)
  • register- 自动存储时间。还提示编译器将变量放在处理器的寄存器中(已弃用)
  • static- 静态或线程存储持续时间和内部链接
  • extern- 静态或线程存储持续时间和外部链接
  • thread_local- 线程存储持续时间(C++11 起)

储存期限

  • automatic储存期限。该变量在封闭代码块的开头分配并在结束时释放。所有非全局变量都有这个存储持续时间,除了那些声明的static,externthread_local.
  • static储存期限。变量在程序开始时分配,在程序结束时释放。该变量仅存在一个实例。所有全局变量都有这个存储持续时间,加上那些用staticor声明的extern
  • thread储存期限。变量在线程开始时分配,在线程结束时释放。每个线程都有自己的变量实例。只有声明的变量thread_local具有此存储持续时间。thread_local可以同时出现staticextern调整联动。(C++11 起)
  • dynamic储存期限。变量通过使用动态内存分配函数在每个请求中分配和释放。

联动。表示对象、引用、函数、类型、模板、命名空间或值的名称可能具有链接。如果名称具有链接,则它指的是与另一个范围内的声明所引入的相同名称相同的实体。如果在多个作用域中声明了一个变量、函数或另一个具有相同名称的实体,但没有足够的链接,则会生成该实体的多个实例。

认可以下联系:

  • 没有联动。名称只能从它所在的范围内引用。
  • 内部联动。可以从当前翻译单元的所有范围中引用该名称。
  • 外部联动。可以从其他翻译单元的范围中引用该变量。

参考。

于 2013-07-22T10:03:51.480 回答
0

虽然我对这些概念有直观的理解,但我很好奇它们的真正含义。规则是什么以及为什么它们是这样的。

所以我写了一篇关于它的完整博客文章,它在不成为标准的情况下尽可能详尽,但更容易理解。

以下是关键见解:

(C 中的对象是变量或函数)

声明的范围是可以看到和使用声明的代码部分。

请注意,这并没有说明是否可以通过另一个声明从代码的其他部分访问与声明关联的对象!

我们通过它的内存来识别一个唯一的对象:变量或函数代码的存储。

持续时间指示与声明关联的对象是在整个程序执行期间持续存在(静态持续时间),还是在进入声明范围时动态分配(动态持续时间)。

链接决定了同一对象的多个声明是引用同一对象还是单独的对象。

关于Linkage,如果我们稍微简化一下:

  • 无链接:声明引用了一个唯一的对象
  • 内部链接:编译单元中的所有声明都引用同一个对象
  • 外部链接:程序中所有带有外部链接的声明都指向同一个对象

最后,一个方便的规则:

可以仅使用三个规则(最优先规则优先)来确定任何声明的关联和持续时间:

  • 在函数中,声明extern没有链接。

  • 在函数内,没有externstatic具有自动持续时间的声明。任何其他声明,在任何范围内,都具有静态持续时间。

  • 在编译单元中,如果有一个带有static存储类说明符的声明,则对象具有内部链接。此声明必须发生在任何extern声明之前,并且不能有任何没有存储类说明符的声明(否则会出现编译错误)。否则,它们具有外部联系。

我希望这有帮助!

于 2015-01-26T23:21:54.113 回答