C++ 将结构放在匿名命名空间中做什么?
可能重复:C++ 将结构放在匿名命名空间中做什么?,c++,oop,object,data-structures,namespaces,C++,Oop,Object,Data Structures,Namespaces,可能重复: 看看某人的代码,他们声明如下: namespace { struct myStruct { int x; int y; } obj1; } …在函数中,我看到它是这样使用的: myStruct& var = obj1; (注意名称空间是匿名的。) 从我对它的使用情况来看,我不明白为什么会这样声明和使用它 这样声明有什么不同吗? 还有,为什么指针是这样创建的,而不是传统的样式。i、 e.我的结构*ptr 谢谢大家! 在匿名名称空间中声明的所
看看某人的代码,他们声明如下:
namespace {
struct myStruct {
int x;
int y;
} obj1;
}
…在函数中,我看到它是这样使用的:
myStruct& var = obj1;
(注意名称空间是匿名的。)
从我对它的使用情况来看,我不明白为什么会这样声明和使用它
这样声明有什么不同吗?
还有,为什么指针是这样创建的,而不是传统的样式。i、 e.我的结构*ptr
谢谢大家! 在匿名名称空间中声明的所有内容都会得到一个唯一的、不可知的名称,因此不能从任何其他翻译单元引用。因此,可以保证匿名名称空间仅在当前翻译单元的本地,并且永远不会与其他翻译单元冲突
例如,如果您说名称空间{int i;}
,则保证只有当前翻译单元才能看到全局i
。即使此声明位于包含在多个不同TU中的头中,每个TU也会收到其自己的全局变量副本(每个都具有不同的、未知的完全限定名)
其效果类似于在C++03中声明一个全局对象static
(它提供了全局对象的内部链接),其中匿名命名空间中的对象可能仍然具有外部链接。在C++11中,根据3.5/4,未命名名称空间中的名称具有内部链接,因此变量和函数的效果与声明它们时的效果完全相同static
–但是内部链接不仅仅适用于变量和函数(例如枚举、类、模板),因此在C++11中,您应该始终更喜欢未命名名称空间在C++中,只允许在给定的命名范围内有一个定义。如果有多个翻译单元,仍然只允许有一个定义,但编译器不能保证所有定义都是相同的。也就是说,如果需要本地类型,例如结构
或类
,则需要确保定义不与任何其他翻译单元中的其他类型冲突。在大型项目中这样做几乎是不可能的,除非你有办法在本地保护你的类型。这就是未命名名称空间提供的功能:未命名名称空间中定义的任何名称在整个可执行文件中都是唯一的。它与static
关键字的作用基本相同,但实际上并不强制内部链接。变量仍然是外部链接的,您无法在任何其他转换单元中解析其名称。这是必要的,因为模板参数必须具有外部链接,或者至少用于要求这样的链接
var
也不是指针,它是一个引用。它不像其他指针那样创建,因为它不是一个指针
另外,为什么指针是这样创建的,而不是这里显示的传统样式。i、 e.我的结构*ptr
它是一个引用,而不是指针,是用myStruct&var=obj1然而,相同的原理也适用于指针。许多C++程序员更喜欢<代码> MyStRe> pTr>代码>过代码> MyStRe> pTr>代码>代码> MyStult&Ref/Cuff> > <代码> MyStult&Ref>代码>。编译器不在乎你用哪一个。此样式首选项适用于代码的读者
将星号或符号与类型而不是变量一起放置的原因是,星号或符号在逻辑上是类型的一部分。ptr
的类型是指向myStruct
的指针。此方案会出现一个潜在问题:Type*ptr1、ptr2由于从C继承的规则,ptr2
不是指针。它只是一个int
这个问题有一个简单的解决办法。不要那样做!一般来说,最好每个声明声明一个变量,除了inti,j,k代码>不要混合指针和非指针。至于问题的第二部分,参考文献不是指针;请参阅此处了解更多信息:匿名命名空间可以防止名称冲突IIRC。不过,我可能错了。请看,,。另外,从技术上讲,它们被称为未命名名称空间。对于指针和引用,请看它确实强制内部链接,因为C++11。