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中,您应该始终更喜欢未命名名称空间结构
,则需要确保定义不与任何其他翻译单元中的其他类型冲突。在大型项目中这样做几乎是不可能的,除非你有办法在本地保护你的类型。这就是未命名名称空间提供的功能:未命名名称空间中定义的任何名称在整个可执行文件中都是唯一的。

它与
static
关键字的作用基本相同,但实际上并不强制内部链接。变量仍然是外部链接的,您无法在任何其他转换单元中解析其名称。这是必要的,因为模板参数必须具有外部链接,或者至少用于要求这样的链接

var
也不是指针,它是一个引用。它不像其他指针那样创建,因为它不是一个指针

另外,为什么指针是这样创建的,而不是这里显示的传统样式。i、 e.我的结构*ptr

它是一个引用,而不是指针,是用
myStruct&var=obj1 MyStRe> pTr>代码>过代码> MyStRe> pTr>代码>代码> MyStult&Ref/Cuff> > <代码> MyStult&Ref>代码>。编译器不在乎你用哪一个。此样式首选项适用于代码的读者

将星号或符号与类型而不是变量一起放置的原因是,星号或符号在逻辑上是类型的一部分。
ptr
的类型是指向
myStruct
的指针。此方案会出现一个潜在问题:
Type*ptr1、ptr2ptr2
不是指针。它只是一个
int


这个问题有一个简单的解决办法。不要那样做!一般来说,最好每个声明声明一个变量,除了
inti,j,k不要混合指针和非指针。

至于问题的第二部分,参考文献不是指针;请参阅此处了解更多信息:匿名命名空间可以防止名称冲突IIRC。不过,我可能错了。请看,,。另外,从技术上讲,它们被称为未命名名称空间。对于指针和引用,请看它确实强制内部链接,因为C++11。