【问题标题】:Is it acceptable to not include all function declarations in the header to create a "private namespace"?在头文件中不包含所有函数声明以创建“私有命名​​空间”是否可以接受?
【发布时间】:2014-09-09 01:13:44
【问题描述】:

我已经写了一段时间的代码了。我一直在使用命名空间来分隔几部分代码,以使代码更具可读性。但是,我遇到了一个问题,我想在那个私有的地方做点什么。以下是我发现的作品:

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

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

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

【问题讨论】:

标签: c++ namespaces private


【解决方案1】:

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

// foobar.cpp

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

如果你想在定义函数之前声明它,你可以添加:

namespace 
{
    void foo_barz();
}

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

实现相同目的的另一种方法是将函数声明为静态:

static void foo_barz() { ...

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

【讨论】:

  • 对于匿名命名空间,我将如何编写函数原型/引用以使用foo_barz?还有,对于静态函数,我还是没有在头文件中包含这个?
  • 仅当您打算从其他单元使用它们时,才将它们包含在头文件中。 (所以,在这种情况下不要这样做)。更新帖子以包含函数原型,仅当您不能将函数定义放在其调用之前时才需要这样做
  • RE static 与未命名的 namespace 辩论我只是发现更容易阅读包装在命名空间中的定义,而不是在所有内容前面都有 static
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多