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

时间:2014-09-09 01:13:45

标签: c++ namespaces private

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

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

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

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

1 个答案:

答案 0 :(得分:6)

真正使foo_barz"私有" (即,无法从其他单位访问其名称),将其放在匿名名称空间中,而不是foo_bar

// foobar.cpp

namespace   /* stuff in here is only visible within this unit */
{ 
    void foo_barz() { ...
}

如果您想在定义之前声明该功能,可以添加:

namespace 
{
    void foo_barz();
}

因为同一单元中的多个未命名的命名空间实际上都引用了同一个未命名的命名空间。

实现同样的事情的另一种方法是将函数声明为static:

static void foo_barz() { ...

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