跳转到内容

C++/变量

维基教科书,自由的教学读本
< C++

变量的声明与定义

[编辑]

全局、局部、类成员的变量

[编辑]

变量的数据类型

[编辑]

变量的作用域

[编辑]

变量的生存期与链接性

[编辑]

生存期(storage duration)是指变量从生到死的时间。链接特性(linkage)是指名字在编译单元以外是否引用到同一实体。

生存期(storage duration)包括:

  • 自动生存期(automatic storage duration):局部变量,从它的定义开始了生存期,它的定义所在的块(block)的结束而终止了该变量的生存期。
  • 线程生存期(thread storage duration):线程创建时开始了变量的生存期,线程结束时终止变量的生存期
  • 静态生存期(static storage duration):进程创建时开始了变量的生存期,进程结束时终止变量的生存期
  • 动态生存期(dynamic storage duration):显式申请、释放内存。

链接特性(linkage)包括:

  • 内部链接性(internal linkage):名字在当前编译单元的各作用域中有效。下述在命名空间中声明的名字具有内部链接性:声明为static的变量、变量模板、函数、函数模板;const变量,且non-volatile non-template、non-inline、non-exported,没有声明为extern,此前也没有声明为外部链接性;匿名联合的数据成员;匿名命名空间或其子空间中的一切名字,即使被声明了extern,都是内部链接性。
  • 外部链接性(external linkage):名字在其他编译单元中也可用于指向同一实体。
  • 无链接性(no linkage):块作用域中声明的名字,对下述情形,都是无链接性,即只能在该作用域中引用该名字:
    • 变量没有明确声明为extern(无论是否有static修改符)
    • 局部类与其成员函数
    • 块作用域中声明的其他名字,如typedefs, enumerations, enumerators

指示字static只用于对象声明(但不能用于函数形参列表)、函数声明(不能用于块作用域)、匿名联合的声明。在类成员声明,它声明了一个静态成员。在声明对象时,它指出了静态生存期,但如果与thread_local一起用,有不同含义;如果声明是在命名空间作用域,它指出内部链接性。

指示字extern只用于变量与函数的声明(不包含类成员或函数形参)。它指出了外部链接性,技术上不影响生存期,但它不能用于自动生存期对象,因此所有外部链接性对象都具有静态或线程生存期。一个变量声明使用了extern但没有初始化,不被认为是变量的定义。

关键字thread_local只允许声明对象在命名空间作用域、块作用域或静态数据对象。指示对象具有线程生存期。静态数据对象只能具有外部链接性。额外的static指示字表明对象具有内部链接性。 额外的extern指示字表明对象具有外部链接性。