【问题标题】:Using directive best practice使用指令最佳实践
【发布时间】:2011-12-09 00:05:39
【问题描述】:

以下之间是否存在任何功能或优化差异?

// SomeClass.cpp
#include "SomeClass.h"
#include "SomeOtherClassInSomeClassNamespace.h"

using namespace SomeClassNamespace;

SomeClass::SomeClass() {}

void SomeClass::SomeFunc() 
{
    // uses some stuff in SomeClassNamespace not defined  in SomeClass.h
}

// SomeClass.cpp
#include "SomeClass.h"
#include "SomeOtherClassInSomeClassNamespace.h"

namespace SomeClassNamespace
{
    SomeClass::SomeClass() {}

    void SomeClass::SomeFunc() 
    {
        // uses some stuff in SomeClassNamespace not defined  in SomeClass.h
    }
}

【问题讨论】:

  • @Bala R 不太清楚 - 我知道 using 指令可能存在的危险,但这是具体情况,这里没有讨论

标签: c++ namespaces


【解决方案1】:

以下功能有区别吗?

只要合并的作用域按预期解析,则

下面的优化有区别吗?

运行时或二进制大小? 没有。

如果您想要build 优化,那么将通过using 和/或通过重新打开命名空间来引入额外的复杂性。

我不使用前者,因为分辨率可能有问题。

我不使用后者,因为很容易得到新的声明。

我的使用方式:

namespace {
  // ... private stuff
}

SomeClassNamespace::SomeClass::SomeClass() {}
...

这有点冗长,但可以快速解决定义及其声明,减少冲突的机会,可以减少程序员错误,并且如果匿名命名空间中的定义最终被导出,则可以减少二进制大小(如果您还使用私有实现)。当然,将您的内部结构(“SomeClassNamespace 中的一些内容未在 SomeClass.h 中定义”)保留在正确的命名空间中也是有意义的(假设它们在多个 TU 中使用)。

【讨论】:

  • 是的,我使用未命名的命名空间以及任何一种情况。有时适合我需要的另一种可能性是使用声明。 using SomeClassNamespace::SomeClass; 这样我就不需要在每个定义前面加上SomeClassNamespace::。烦恼是当我在一个命名空间中的 system 中有 5 或 6 个类时,我不想在每个 cpp 的顶部编写一堆 using 声明。
  • @Dave 也许你想在你的内部尝试命名空间别名namespace SMClsNs = SomeClassNamespace; 或 typedefs?完全合格的范围已经有一段时间没有打扰我了......
  • 他们不会在用户代码中打扰我,他们会在实现一个类时打扰我 in 该命名空间
【解决方案2】:

namespace { 保持一致,您应该缩进文件中的所有内容,这将减少您可以在一行滚动出视图之前放置的实际代码量。

using 语句没有这个问题。

使用namespace { 选项您可能还会收到更令人困惑的错误消息,因为命名空间的右大括号可能会关闭其他未正确关闭的内容。您最终可能会收到关于名称空间缺少右括号的令人困惑的消息。

除此之外,我不知道有什么不同。

【讨论】:

  • 当您有几个子命名空间时,正确的缩进会变得有问题。很多人对此进行特殊情况缩进(保持平整)。
  • @Dave,是的,但这种不一致困扰着我。使用using namespace 似乎稍好一些。真的很小,但由于这两种形式几乎没有区别......
【解决方案3】:

这是我唯一一次使用using namespace X;

并且我确保文件中唯一的内容是命名空间 X 内的类的定义(并且一次只有一个类)。

我这样做的唯一原因是(和个人意见)我认为它使整体阅读更容易。它在顶部的一行中记录了我们正在使用的命名空间(特别是如果它是多级嵌套命名空间)。

【讨论】:

猜你喜欢
  • 2018-01-03
  • 1970-01-01
  • 2011-06-09
  • 2013-07-13
  • 2012-12-31
  • 2013-01-23
  • 2021-05-31
  • 2011-11-05
  • 2011-02-11
相关资源
最近更新 更多