C : 命名空间——如何在头文件和源文件中正确使用?

新手上路,请多包涵

考虑一对两个源文件:一个接口声明文件( *.h*.hpp )及其实现文件( *.cpp )。

*.h 文件如下所示:

 namespace MyNamespace {
  class MyClass {
  public:
    int foo();
  };
}

我已经看到了在源文件中使用命名空间的两种不同做法:

*.cpp 展示练习#1:

 #include "MyClass.h"
using namespace MyNamespace;

int MyClass::foo() { ... }

*.cpp 展示练习#2:

 #include "MyClass.h"
namespace MyNamespace {

  int MyClass::foo() { ... }

}

我的问题: 这两种做法之间有什么区别吗?一种被认为比另一种更好吗?

原文由 nickolay 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

从代码可读性的角度来看,出于这个原因,我认为使用#2 方法可能更好:

您可以是 using 一次有多个命名空间,并且写在该行下方的任何对象或函数都可以属于这些命名空间中的任何一个(除非命名冲突)。将整个文件包装在 namespace 块中更加明确,并允许您在 .cpp 文件中声明属于该命名空间的新函数和变量

原文由 Dan F 发布,翻译遵循 CC BY-SA 3.0 许可协议

我认为 实践#1 根本不是正确的 C++ 代码。此代码片段定义 ::MyClass::foo 符号,其中真正的全限定名称是 ::MyNamespace::MyClass::foo。

要了解命名空间,您可以阅读草案的第 7.3 节,比如说标准 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf

这个概念从 1998 年左右开始就已经很老了,因此您可以使用 B.Stroustroup 的任何标准或书籍来了解它。

在 C++ 语言中, 命名空间 是一个命名范围。与类定义相反,命名空间可以向其添加新功能。

构造 “使用命名空间 NS;” 在 C++ 中被称为 using-directive,在我的实践中它可以用于多个目标:

  1. 您可以在另一个命名空间中使用此指令来组合(混合)来自不同命名空间的名称。
  2. 在编译单元的上下文中,它会将同义词附加到命名空间 NS 中的所有变量。

要定义符号,您可以使用两种机制 - 您可以通过在 C++ 源文件中的全局命名空间中操作来对所有命名空间使用显式限定。

或者您可以打开命名空间并向其添加定义(练习 #2)。

原文由 Konstantin Burlachenko 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题