cpp存储类型说明符(storage class specifier)
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)相关推荐
- 16 WM配置-策略-激活存储类型搜索(Storage Type Search)
业务背景:存储类型搜索的定义需要弄清楚下面两句话,就可以知道在定义什么内容. 第1句话的意思:物料入库时,需要从哪个存储类型上架? 第2句话的意思:物料出库时,需要到哪个存储类型下架? 本文定义的存储 ...
- C语言中【变量】的存储类型共有4种类型
在C语言中,对变量的存储类型说明有以下四种: auto 自动变量 (动态存储) register 寄存器变量(动态存储) extern 外部变量(静态存储) ...
- c语言存储类型重要吗,C语言储存类别(Storage Class)
C语言存储类别(Storage Class) C语言中,存储类别(Storage Class)是一个标识符(也就是说函数和变量)的重要属性.存储类别决定着一个函数或变量的作用域(Scope,即可见性) ...
- SAP WM 使用Storage Location Reference实现IM层面的存储地点和WM层面的存储类型之间的软关联
SAP WM 使用Storage Location Reference实现IM层面的存储地点和WM层面的存储类型之间的软关联 工厂代码NMDC下2个存储地点0001和0003,对应的Warehouse ...
- SAP WM中阶之存储类型设置界面里的’Return Stock To Same Storage Bin’
SAP WM中阶之存储类型设置界面里的'Return Stock To Same Storage Bin' 在SAP WM存储类型的配置界面里,有一个选项叫做'Return Stock to Same ...
- SAP WM中阶存储类型里的Full stk rmvl 字段和Return Storage type字段
SAP WM中阶存储类型里的Full stk rmvl 字段和Return Storage type字段 SAP WM存储类型的配置里,可以配置从某个存储区域里下架的时候都是全数下架,不管需要下架的数 ...
- VS报错 <error-type> 此声明没有存储类或类型说明符
因为你没把代码放进函数里.... 参考文章:此声明没有存储类或类型说明符
- 此声明没有存储类或类型说明符
此声明没有存储类或类型说明符,出现这个问题是因为在函数体外面调用了函数,因为,此时还没有进入栈. 转载于:https://www.cnblogs.com/drunknbeard/p/10046344. ...
- 5 WM配置-主数据-定义存储类型(Storage Type)
业务背景:根据之前创建好的仓库号<1 WM配置-企业结构-定义-创建仓库号>, 设定每个仓库号下具体的存储类型.存储类型的格式为:3个字符,可以为纯数字或字母,也可以是数字和字母混搭. 什 ...
- C语言再学习 -- 存储类型关键字
定义: 是对声明的实现或者实例化.连接器(linker)需要它(定义)来引用内存实体.与上面的声明相应的定义如下:参看:C语言再学习 -- 存储类.链接 C语言中有 5 个作为存储类说明符的关键字,分 ...
最新文章
- JAVA那点破事!并发、IO模型、集合、线程池、死锁、非阻塞、AQS....
- NGINX(一)内存结构
- Oracle8i 到Oracle 12c的2014年最新PSU、Bundle Patch、SPU信息
- 在大数据里:Hadoop可能是你的救命稻草
- 开发web前端_移动前端开发和web前端开发的区别?
- 数组的循环右移问题(好未来笔试题)
- Spark SQL(二)之DataSet操作
- 好机会,我要帮女同事解决Maven冲突问题
- Linux负载均衡Linux Virtual Server (lvs) 内核自带的负载均衡器
- flutter创建一个demo
- eclipse远程连接hadoop_Hadoop群启集群
- 小兔的棋盘 (卡特兰数) 递推动规
- java 自定义进度条_JAVA Swing 自定义进度条样式(简单实现)
- 信息安全毕设论文选题推荐
- 循序渐进Linux目录
- android自定义素材拼图,美图秀秀Android新版 拼图排版秀北爱
- 终于有人把前端鉴权讲明白了
- linux中ping命令详解,全面解析Ping命令
- 墙裂推荐一个高质量的数据分析学习平台
- 为知笔记docker镜像安装
热门文章
- 实习学习:项目用的DDD,什么是DDD开发?
- 安卓直播详细教程(一)-----bilibili开源播放器
- mysql会话杀不掉_SQL Server会话KILL不掉,一直处于KILLED /ROLLBACK状态情形浅析
- file 关闭_不会吧,还有人在 finally 里关闭资源?
- java 联合_Java标记的联合/和类型
- dede图片上传php,织梦DEDE 栏目字段添加并调用:例如图片上传
- H3C交换机设备使用QOS策略方式实现报文过滤
- django中怎样新建html页面,Django网站创建从html页面到另一个应用程序的主html页面的链接...
- java 位与 取模_【Java基础】14、位与()操作与快速取模
- 优酷ts转换mp4_下载腾讯视频并转成MP4