标准中写道:
当名称具有内部链接时,它所表示的实体可以是
由同一翻译单元中其他范围的名称引用。
and:
具有命名空间范围 (3.3.6) 的名称具有内部链接,如果它是
变量、函数或函数模板的名称
显式声明为静态;
所以考虑下面的代码:
#include <stdio.h>
namespace A
{
/* a with internal linkage now.
Entity denoted by a will be referenced from another scope.
This will be main() function scope in my case
*/
static int a=5;
}
int main()
{
int a; //declaring a for unqualified name lookup rules
printf("%d\n",a);//-1216872448
}
我真的不明白标准中的定义。这意味着什么:
它所表示的实体可以通过其他范围的名称来引用
相同的翻译单位。
A 翻译单位 https://stackoverflow.com/questions/1106149/what-is-a-translation-unit-in-c通常由单个源文件组成#include
d 文件和结果合二为一目标文件.
A name in 命名空间范围默认情况下有外部链接,这意味着您可以从其他翻译单元引用该名称(使用范围解析运算符或 using 指令)。但如果名称符合static
,链接变为internal,并且该名称不能在定义它的翻译单元之外引用。
在您的示例中,您可以访问a
如果命名空间A
, 名字a
and main
方法是在same翻译单位。但在main
,您正在声明另一个变量a
,这隐藏了a
在命名空间中A
。和a
main 中未初始化,因此当您打印时,它实际上打印了来自的垃圾值a
声明于main
。如果你想使用a
from A
in main
,使用像cout<<A::a
or use using namespace A;
在源文件中包含main
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)