首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >c++命名空间最佳实践困境

c++命名空间最佳实践困境
EN

Stack Overflow用户
提问于 2011-08-05 18:40:50
回答 6查看 24.2K关注 0票数 33

我发现,我认为在c++中使用名称空间的“最佳实践”正在损害代码的可读性,并让我质疑如何更好地使用它们。

我的程序由几个不同的模块组成,这些模块大多内置于“主”应用程序使用的库中。每个库都使用自己的命名空间,它们的命名空间都“在”项目命名空间内,以帮助项目避免与第三方代码的名称冲突。因此,我以"myproject::logging::Logger“和"myproject::reporting::ReportType”这样的类名结束(作为虚构的示例)。

到目前一切尚好。在我的.cpp文件中,我没有任何问题。例如,我在顶部使用"using myproject:: Logging“,并且可以干净利落地引用我的日志类。在我的两个命名空间之间发生冲突的情况下,我可以明确地说明我想要哪个命名空间。这样做效果很好。

但是头文件是不同的。将using语句放入头文件被认为是不好的做法,因为它们会影响不相关的代码,而这些代码可能并不需要它们。因此,我总是完全限定.hpp文件中的所有名称。这有点难看,但到目前为止还可以处理,所以我已经忍受了。但是现在我越来越多地在我的库中使用模板代码,这意味着现在我的.hpp文件中有更多的实际代码。而且,由于类型名称的长度,必须完全限定每个名称实际上会使代码不可读。

我开始感觉到,名称空间和使用它们的最佳实践的好处开始被我必须编写的代码的不可读所掩盖。我开始想,如果放弃使用名称空间来获得更具可读性的代码,并在出现名称冲突时修复它们,是否会更好。

另一种选择是使用简短的单层名称空间,而不是"myproject::logging::Logger“,这样我就只使用"log::Logger”,这将有很大帮助,但会使名称空间冲突的可能性更高,并使名称空间传递更少有用的信息。

正如我已经说过的,这只会影响.hpp文件中的代码,因为我很乐意在实现文件中使用“使用名称空间”来使其易于管理,但当我现在查看.hpp文件中的模板化代码时,它正在成为一个问题,并认为“恶……”这不可能是好消息:P

有人有什么实用的建议吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-08-05 18:56:45

我以前也遇到过这种情况。通常情况下,头文件中的许多模板函数/类实际上是“实现”的,尽管根据C++中模板的性质,您必须将它们放在一个头文件中。因此,我只是将所有内容放在某个“细节”或“实现”名称空间中,在那里我可以轻松地使用“使用名称空间”。最后,我将人们应该使用的东西“丢弃”到相应的地方。如下所示:

代码语言:javascript
复制
namespace myproject { namespace somemodule {

namespace _implementation {

using namespace myproject::othermodule;
using namespace myproject::yetanothermodule;

template <...>
class some_internal_metafunction{
...
};

template <...>
class stuff_people_should_use_outside {
...
};

} // namespace implementation       

using stuff_people_should_use_outside ;
}} // namespace myproject::somemodule

不过,这种方法可能会将编译器报告中的名称放大一点。

或者,您可以放弃模块命名空间。但是对于一个非常大的项目来说,这可能不是一个好主意。

票数 23
EN

Stack Overflow用户

发布于 2011-08-05 18:58:48

这是我要做的。

<mylibrary.h>

代码语言:javascript
复制
namespace myproject {
  namespace mylibrary
  {
    namespace impl
    {
      using namespace otherlibrary;
      using namespace boost;
      using namespace std;
      using namespace whatever::floats::your::boat;

      class myclass;
      class myotherclass;
    };
    using impl::myclass;
    using impl::myotherclass;
  };
};

在源代码中:

代码语言:javascript
复制
#include <mylibrary.h>
using namespace myproject::mylibrary; //clean!
票数 24
EN

Stack Overflow用户

发布于 2011-08-05 18:47:10

就个人而言?我会去掉“我的项目”这部分。您的库使用与另一个库完全相同的名称空间名称,并使用与另一个库完全相同的名称定义符号的可能性有多大?

此外,我还建议为您期望在headers中使用的名称空间使用较短的名称。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6955023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档