是否可以在标题中包含所有函数声明来创建"私有命名​​空间"?

Ano*_*uin 3 c++ namespaces private

我已经写了一段代码了.我一直在使用命名空间来分隔代码的一些部分,以使代码更具可读性.然而,我遇到了一个问题,我想在那个私人的东西.这是我发现的作品:

//foobar.h
namespace foo_bar {
  //Other items here...
}
Run Code Online (Sandbox Code Playgroud)
//foobar.cpp
namespace foo_bar {
  //Other items here...
  void foo_barz() {..
    //Faked private method!
  }
}
Run Code Online (Sandbox Code Playgroud)

它汇编得很好.使用这种方法有什么负面的吗?我认为一个类可能是一个更好的选择,但当时使用命名空间似乎是一个更简单的解决方案,因为它只是一个项目.有没有更"传统"的方式来做到这一点?这可能会导致其他问题吗?这有什么问题呢?

编辑:我想我不清楚我做了什么.我做的是这样的:我没有在头文件中包含函数原型,所以当包含时,头文件使得包含文件的代码认为该函数不存在.

M.M*_*M.M 6

要使其foo_barz真正"私有"(即不能从其他单元访问其名称),请将其放在匿名命名空间中,而不是foo_bar:

// foobar.cpp

namespace   /* stuff in here is only visible within this unit */
{ 
    void foo_barz() { ...
}
Run Code Online (Sandbox Code Playgroud)

如果要在定义函数之前声明该函数,可以添加:

namespace 
{
    void foo_barz();
}
Run Code Online (Sandbox Code Playgroud)

因为同一单元中的多个未命名的命名空间实际上都指向同一个未命名的命名空间.

另一种实现相同功能的方法是将函数声明为static:

static void foo_barz() { ...
Run Code Online (Sandbox Code Playgroud)

这可以在命名空间的内部或外部完成.有些人不赞成这个选项(原因我不清楚).