在C标准(6.2.2标识符的连接)中,有足够清楚的文字
4对于在可见该标识符的先前声明的范围内用存储类说明符extern声明的标识符,31)如果先前的声明指定内部或外部链接,则后一声明中标识符的链接与先前声明中指定的链接相同。如果没有先前的声明可见,或者如果先前的声明指定没有链接,则标识符具有外部链接。
但是,我在C++标准中找不到类似的说法,看看它的6.5节程序和链接。
这一问题是由于以下C++ 17标准的引用引起的
3具有名称空间作用域(6.3.6)的名称如果名称为 (3.2) -非易失性const限定类型的非内联变量,既不显式声明extern,也不先前声明为具有外部链接;或
现在考虑以下声明
const int x = 100;
extern const int x;因此,不清楚代码是不正确的,还是常量x具有内部链接,尽管它是与说明符extern声明的,或者标准在描述这一段时有缺陷,或者我忽略了C++标准中类似于C标准引用的引号。
发布于 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说明符声明的任何声明(不管声明声明的范围是什么类型)。
https://stackoverflow.com/questions/60159969
复制相似问题