The storage class specifiers are a part of the decl-specifier-seq of a name’s declaration syntax. Together with the scope of the name, they control two independent properties of the name: its storage duration and its linkage.

存储类型说明符有以下几类:

  • auto:
  • register:
  • static:
  • extern:
  • thread_local:
  • mutable:

解释:

  • auto存储说明符
  • extern存储类型说明符仅被允许在变量和函数的声明中使用(类成员函数或函数参数除外)。它会指定外部链接,并且从技术上讲不会影响存储持续时间,但是不能在自动存储持续时间对象的定义中使用它,因此所有外部对象都具有静态或线程持续时间。另外,使用extern并且没有初始化程序的变量声明不是定义。

知识补充


存储持续时间(storage duration)

一个程序中所有的对象都具有以下一种存储持续时间:

  • 自动存储持续时间(automatic storage duration):这种对象的存储空间在封闭代码块的开头分配,并在结尾处重新分配。除了声明为static,extern或thread_local的那些对象外,所有本地对象都具有此存储持续时间。
  • 静态存储持续时间(static storage duration):这种对象的存储空间在程序开始时分配,并在程序结束时释放。该对象仅存在一个实例。在名称空间(namespace)范围内声明的所有对象(包括全局名称空间)都具有此存储持续时间,同时包括使用静态(static)或外部(extern)声明的对象。有关使用此存储持续时间初始化对象的详细信息,请参见非局部变量和静态局部变量。
  • 线程存储持续时间(thread storage duration):这种对象的存储空间在线程开始时分配,在线程结束时释放。每个线程都有自己的对象实例。只有声明为thread_local的对象才具有此存储持续时间。thread_local可以与static或extern一起出现,以调整链接过程。有关使用此存储持续时间初始化对象的详细信息,请参见非局部变量和静态局部变量。
  • 动态存储持续时间(dynamic storage duration):通过使用动态内存分配功能,可以按请求分配和释放对象的存储。有关使用此存储持续时间初始化对象的详细信息,请参见new-expression。

链接

表示对象,引用,函数,类型,模板,名称空间或值的名称可能具有链接。如果名称具有链接,那它会指向在其他作用域声明的相同的名称代表的实体。如果在多个作用域中声明了变量,函数或具有相同名称的另一个实体,但是没有足够的链接,则将生成该实体的多个实例。

如下的链接可以被识别:

无链接(no linkage):

此时名称仅可以在它的命名空间内被引用。在代码块中声明的如下名称是无链接的:

  • 没有被显式的声明为extern的变量(无视静态修饰符)
  • 局部类以及这些类的成员函数
  • 其他在块命名空间中的名称(例如typedef、enumeration、enumerator)

内部链接(internal linkage):

此时名称可以在它当前翻译单元(translation unit)中的所有作用域中被引用。在命名空间中声明的如下名称是内部链接的:

  • static声明的变量、变量模板、函数、函数模板
  • non-volatile non-template (since C++14) non-inline (since C++17) non-exported (since C++20) const-qualified variables (including constexpr) that aren’t declared extern and aren’t previously declared to have external linkage;
  • data members of anonymous unions.

外部链接(external linkage):

此时可以从其他翻译单元(translation unit)的命名范围中引用该名称。具有外部链接的变量和函数也具有语言链接(language linkage),这使得可以链接以不同编程语言编写的翻译单元。

Any of the following names declared at namespace scope have external linkage, unless they are declared in an unnamed namespace or their declarations are attached to a named module and are not exported (since C++20):

  • variables and functions not listed above (that is, functions not declared static, namespace-scope non-const variables not declared static, and any variables declared extern);
  • enumerations
  • names of classes, their member functions, static data members (const or not), nested classes and enumerations, and functions first introduced with friend declarations inside class bodies;
  • names of all templates not listed above (that is, not function templates declared static).

在代码块中第一次进行如下声明的同样也进行外部链接:

  • extern声明的名称和变量
  • 函数名

cpp存储类型说明符(storage class specifier)相关推荐

  1. 16 WM配置-策略-激活存储类型搜索(Storage Type Search)

    业务背景:存储类型搜索的定义需要弄清楚下面两句话,就可以知道在定义什么内容. 第1句话的意思:物料入库时,需要从哪个存储类型上架? 第2句话的意思:物料出库时,需要到哪个存储类型下架? 本文定义的存储 ...

  2. C语言中【变量】的存储类型共有4种类型

    在C语言中,对变量的存储类型说明有以下四种:   auto          自动变量 (动态存储) register     寄存器变量(动态存储) extern       外部变量(静态存储) ...

  3. c语言存储类型重要吗,C语言储存类别(Storage Class)

    C语言存储类别(Storage Class) C语言中,存储类别(Storage Class)是一个标识符(也就是说函数和变量)的重要属性.存储类别决定着一个函数或变量的作用域(Scope,即可见性) ...

  4. SAP WM 使用Storage Location Reference实现IM层面的存储地点和WM层面的存储类型之间的软关联

    SAP WM 使用Storage Location Reference实现IM层面的存储地点和WM层面的存储类型之间的软关联 工厂代码NMDC下2个存储地点0001和0003,对应的Warehouse ...

  5. SAP WM中阶之存储类型设置界面里的’Return Stock To Same Storage Bin’

    SAP WM中阶之存储类型设置界面里的'Return Stock To Same Storage Bin' 在SAP WM存储类型的配置界面里,有一个选项叫做'Return Stock to Same ...

  6. SAP WM中阶存储类型里的Full stk rmvl 字段和Return Storage type字段

    SAP WM中阶存储类型里的Full stk rmvl 字段和Return Storage type字段 SAP WM存储类型的配置里,可以配置从某个存储区域里下架的时候都是全数下架,不管需要下架的数 ...

  7. VS报错 <error-type> 此声明没有存储类或类型说明符

    因为你没把代码放进函数里.... 参考文章:此声明没有存储类或类型说明符

  8. 此声明没有存储类或类型说明符

    此声明没有存储类或类型说明符,出现这个问题是因为在函数体外面调用了函数,因为,此时还没有进入栈. 转载于:https://www.cnblogs.com/drunknbeard/p/10046344. ...

  9. 5 WM配置-主数据-定义存储类型(Storage Type)

    业务背景:根据之前创建好的仓库号<1 WM配置-企业结构-定义-创建仓库号>, 设定每个仓库号下具体的存储类型.存储类型的格式为:3个字符,可以为纯数字或字母,也可以是数字和字母混搭. 什 ...

  10. C语言再学习 -- 存储类型关键字

    定义: 是对声明的实现或者实例化.连接器(linker)需要它(定义)来引用内存实体.与上面的声明相应的定义如下:参看:C语言再学习 -- 存储类.链接 C语言中有 5 个作为存储类说明符的关键字,分 ...

最新文章

  1. JAVA那点破事!并发、IO模型、集合、线程池、死锁、非阻塞、AQS....
  2. NGINX(一)内存结构
  3. Oracle8i 到Oracle 12c的2014年最新PSU、Bundle Patch、SPU信息
  4. 在大数据里:Hadoop可能是你的救命稻草
  5. 开发web前端_移动前端开发和web前端开发的区别?
  6. 数组的循环右移问题(好未来笔试题)
  7. Spark SQL(二)之DataSet操作
  8. 好机会,我要帮女同事解决Maven冲突问题
  9. Linux负载均衡Linux Virtual Server (lvs) 内核自带的负载均衡器
  10. flutter创建一个demo
  11. eclipse远程连接hadoop_Hadoop群启集群
  12. 小兔的棋盘 (卡特兰数) 递推动规
  13. java 自定义进度条_JAVA Swing 自定义进度条样式(简单实现)
  14. 信息安全毕设论文选题推荐
  15. 循序渐进Linux目录
  16. android自定义素材拼图,美图秀秀Android新版 拼图排版秀北爱
  17. 终于有人把前端鉴权讲明白了
  18. linux中ping命令详解,全面解析Ping命令
  19. 墙裂推荐一个高质量的数据分析学习平台
  20. 为知笔记docker镜像安装

热门文章

  1. 实习学习:项目用的DDD,什么是DDD开发?
  2. 安卓直播详细教程(一)-----bilibili开源播放器
  3. mysql会话杀不掉_SQL Server会话KILL不掉,一直处于KILLED /ROLLBACK状态情形浅析
  4. file 关闭_不会吧,还有人在 finally 里关闭资源?
  5. java 联合_Java标记的联合/和类型
  6. dede图片上传php,织梦DEDE 栏目字段添加并调用:例如图片上传
  7. H3C交换机设备使用QOS策略方式实现报文过滤
  8. django中怎样新建html页面,Django网站创建从html页面到另一个应用程序的主html页面的链接...
  9. java 位与 取模_【Java基础】14、位与()操作与快速取模
  10. 优酷ts转换mp4_下载腾讯视频并转成MP4