首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用说明符外部声明的C++中标识符的链接

用说明符外部声明的C++中标识符的链接
EN

Stack Overflow用户
提问于 2020-02-10 23:27:25
回答 1查看 159关注 0票数 2

在C标准(6.2.2标识符的连接)中,有足够清楚的文字

4对于在可见该标识符的先前声明的范围内用存储类说明符extern声明的标识符,31)如果先前的声明指定内部或外部链接,则后一声明中标识符的链接与先前声明中指定的链接相同。如果没有先前的声明可见,或者如果先前的声明指定没有链接,则标识符具有外部链接。

但是,我在C++标准中找不到类似的说法,看看它的6.5节程序和链接。

这一问题是由于以下C++ 17标准的引用引起的

3具有名称空间作用域(6.3.6)的名称如果名称为 (3.2) -非易失性const限定类型的非内联变量,既不显式声明extern,也不先前声明为具有外部链接;或

现在考虑以下声明

代码语言:javascript
复制
const int x = 100;
extern const int x;

因此,不清楚代码是不正确的,还是常量x具有内部链接,尽管它是与说明符extern声明的,或者标准在描述这一段时有缺陷,或者我忽略了C++标准中类似于C标准引用的引号。

EN

回答 1

Stack Overflow用户

发布于 2020-11-17 06:57:56

也许是basic.link#6中的一个缺陷,在看了dcl.stc#5之后,它说:

有关使用外部说明符声明的名称的链接,请参见basic.link。

但是,关于用extern说明符声明的声明的规则主要是在basic.link#6中,即:

在块作用域中声明的函数的名称和由块作用域extern声明声明的变量的名称具有链接。如果将这样的声明附加到指定的模块上,则程序的格式是错误的。如果有一个具有链接的实体的可见声明,忽略在最内部封闭的命名空间范围之外声明的实体,那么如果两个声明出现在同一个声明区域中,则块范围声明将是(可能不正确)重新声明,则块作用域声明声明该实体并接收前一个声明的链接。如果有多个这样的匹配实体,则程序的格式不正确.否则,如果没有找到匹配的实体,块作用域实体将接收外部链接。如果在翻译单元内,同一实体被声明为具有内部和外部连接的,则程序是不正确的。

听起来,这些规则只适用于块范围声明,而不适用于使用extern说明符声明的命名空间范围声明。除了本段之外,在basic.link节中没有更多的规则来指示extern说明符声明的名称的链接。与C标准中的内容不同,规则适用于使用extern说明符声明的任何声明(不管声明声明的范围是什么类型)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60159969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档