将结构放入匿名命名空间有啥作用? [复制]

Posted

技术标签:

【中文标题】将结构放入匿名命名空间有啥作用? [复制]【英文标题】:What does putting a structure in an anonymous namespace do? [duplicate]将结构放入匿名命名空间有什么作用? [复制] 【发布时间】:2012-09-14 09:15:49 【问题描述】:

可能重复:Why are unnamed namespaces used and what are their benefits?

查看某人的代码,这就是他们声明的内容:

namespace 

  struct myStruct 
     int x;
     int y;
   obj1;


..在一个函数中,我看到它是这样使用的:

myStruct& var = obj1;

(通知namespace 是匿名的。)

从我看到它的使用方式来看,我无法弄清楚为什么要这样声明和使用它。

这样声明有什么不同?

另外,为什么指针是这样创建的,而不是传统样式shown here。即 myStruct *ptr;

谢谢!

【问题讨论】:

至于你问题的第二部分,引用不是指针;请参阅此处了解更多信息:***.com/questions/57483/… 匿名命名空间可以防止名称冲突 IIRC。不过,我可能错了。 见Unnamed/anonymous namespaces vs. static functions、Uses of unnamed namespace in C++、unnamed namespace、Why are unnamed namespaces used and what are their benefits?。 另外,技术上它们被称为未命名的命名空间。 指针与引用,见***.com/questions/57483/… 【参考方案1】:

在匿名命名空间中声明的所有内容都有一个唯一的、不可知的名称,因此不能从任何其他翻译单元引用。因此保证匿名命名空间仅对当前翻译单元是本地的,并且永远不会与其他翻译单元发生冲突。

例如,如果您说namespace int i; ,则保证只有当前翻译单元才能看到全局i。即使此声明位于包含在多个不同 TU 中的标头中,每个 TU 也会收到其自己的全局变量副本(每个副本都有不同的、不可知的完全限定名称)。

效果类似于在 C++03 中声明一个全局对象static(提供全局对象内部链接),其中匿名命名空间中的对象可能仍然具有外部链接。在 C++11 中,未命名命名空间中的名称根据 3.5/4 具有内部链接,因此变量和函数的效果与声明它们的效果完全相同 static - 但内部链接不仅仅适用于变量和函数(例如枚举、类、模板),因此从 C++11 开始,您应该始终更喜欢未命名的命名空间!

【讨论】:

【参考方案2】:

在 C++ 中,您只能在给定的命名范围内拥有一个定义。如果有多个翻译单元,您仍然只能有一个定义,但编译器不能保证所有定义确实是相同的。也就是说,如果您需要一个本地类型,例如 structclass,您需要确保定义确实与其他类型 anywhere 冲突在任何其他翻译单元。在大型项目中这样做几乎是不可能的,除非您有办法以某种方式在本地保护您的类型。这就是未命名命名空间所提供的:在未命名命名空间中定义的任何名称在整个可执行文件中都是唯一的。

【讨论】:

【参考方案3】:

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

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

【讨论】:

确实强制内部链接,因为 C++11。【参考方案4】:

另外,为什么指针是这样创建的,而不是这里显示的传统样式。即 myStruct *ptr;

它是一个引用,而不是指针,它是用myStruct& var = obj1; 创建的,但是同样的原理也适用于指针。许多 C++ 程序员更喜欢 myStruct* ptr 而不是 myStruct *ptrmyStruct& ref 而不是 myStruct &ref。编译器不在乎你使用哪个。此样式偏好适用于代码读者。

将星号或 & 号与类型而不是变量放在一起的原因是因为星号或 & 号在逻辑上是类型的一部分。 ptr 的类型是指向myStruct 的指针。这个方案会出现一个潜在的问题:Type* ptr1, ptr2; 由于继承自 C 的规则,ptr2 不是指针。这只是一个int

这个问题有一个简单的解决方案。不要那样做!一般来说,每次声明最好声明一个变量,但int i,j,k; 等简单的东西除外。不要混用指针和非指针。

【讨论】:

以上是关于将结构放入匿名命名空间有啥作用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

内置函数及匿名函数

DOMDocument 命名空间有啥用?

内置函数随笔及匿名函数

C++不使用匿名命名空间实现内部链接

C++问题:关于匿名命名空间

在多个 DLL 中拥有命名空间有啥影响?