在头和源中创建C ++命名空间(cpp)

时间:2011-11-21 11:19:53

标签: c++ namespaces

在命名空间中包装header和cpp文件内容,或者只包装标题内容然后在cpp文件中执行 using namespace 之间有什么区别吗?

通过差异,我的意思是任何排序性能损失或稍微不同的语义可能导致问题或我需要注意的任何事情。

示例:

// header
namespace X
{
  class Foo
  {
  public:
    void TheFunc();
  };
}

// cpp
namespace X
{
  void Foo::TheFunc()
  {
    return;
  }
}

VS

// header
namespace X
{
  class Foo
  {
  public:
    void TheFunc();
  };
}

// cpp
using namespace X;
{
  void Foo::TheFunc()
  {
    return;
  }
} 

如果没有差异,首选形式是什么?为什么?

8 个答案:

答案 0 :(得分:44)

“命名空间X”与“使用命名空间X”的区别在于第一个新的声明将在名称空间下,而在第二个中它不会。

在你的例子中没有新的声明 - 所以没有区别因此没有偏好的方式。

答案 1 :(得分:33)

命名空间只是一种破坏功能签名的方法,因此它们不会发生冲突。有些人喜欢第一种方式而有些人更喜欢第二种方式。两个版本对编译时性能没有任何影响。请注意,名称空间只是一个编译时实体。

使用命名空间时出现的唯一问题是我们有相同的嵌套命名空间名称(即)X::X::Foo。无论是否使用关键字,这样做会造成更多混淆。

答案 2 :(得分:7)

没有性能损失,因为结果可能是相同的,但是如果您在不同的命名空间中有Foo,则将Foo置于命名空间中会隐含地引入歧义。确实,你可以获得你的代码fubar。我建议为此避免使用using

你在{之后有一个迷路using namespace; - )

答案 3 :(得分:1)

如果第二个编译也是如此,那么应该没有区别。命名空间在编译时处理,不应影响运行时操作。

但对于设计问题,第二是可怕的。即使它编译(不确定),也没有任何意义。

答案 4 :(得分:1)

在VS-case中,Foo :: TheFunc()不在正确的命名空间中。使用'void X :: Foo :: TheFunc(){}'在正确的命名空间(X)中实现该函数。

答案 5 :(得分:0)

如果你只包装.h内容,你必须使用命名空间...在cpp文件中编写,否则你每次都在处理有效的命名空间。通常你包装.cpp和.h文件,否则你有可能使用来自另一个命名空间的对象,这可能会产生很多问题。

答案 6 :(得分:0)

我认为在这里要做的正确的事是使用名称空间进行范围界定。

namespace catagory
{
    enum status
    {
      none,
      active,
      paused
    }
};

void func()
{
    catagory::status status;
    status = category::active;
}

答案 7 :(得分:0)

如果您尝试使用一个变量到另一个变量,那么我建议将它们外部化,然后在源文件中初始化它们,如下所示:

// [.hh]
namespace example
{
   extern int a, b, c;
}
// [.cc]
// Include your header, then init the vars:
namespace example
{
   int a, b, c;
}
// Then in the function below, you can init them as what you want: 
void reference
{
    example::a = 0;
}