【问题标题】:Declare variables in unnamed namespace在未命名的命名空间中声明变量
【发布时间】:2012-07-19 12:33:48
【问题描述】:

在我目前的工作中,我看到在 cpp 文件中的未命名命名空间中声明的变量仅由该类使用,就好像它们是成员变量一样。

我认为这是一种在 .h 中仅保留接口信息并在 .cpp 中实现的有趣方式,并且比通常的 pimpl 惯用语工作量少。

我看到人们一直在使用 pimpl 但从来没有这种方法,它有什么问题吗?

【问题讨论】:

  • “皮条客”成语是“金钱==权力”吗?
  • 在旧 C 语言中,您必须标记全局变量和函数 static 以使它们保持在文件本地而不被导出。在 C++ 中,您可以改为使用匿名命名空间来实现相同的效果。
  • 你能举例说明你的意思吗?您不能在命名空间范围内声明成员,只能在类中声明它们。如果它们在命名空间范围内声明(未命名或未命名),则它们不是成员。

标签: c++ pimpl-idiom


【解决方案1】:

在 .cpp 文件的未命名命名空间中声明的变量是文件范围的;这意味着每次执行程序只有一个实例。

您可以通过创建对象的两个实例并观察它们在未命名的命名空间中相互干扰彼此的变量来亲眼看到这一点。

【讨论】:

  • 只有在 .cpp 文件的未命名命名空间中声明的 static 变量是文件范围的。否则,它们可能具有外部链接,并且也可以从其他文件访问
  • @Andrew non-static 未命名命名空间中的变量可能具有外部链接,但无法从其他翻译单元访问:请参阅stackoverflow.com/questions/4181059/…
【解决方案2】:

请显示一些示例代码。 AFAIK,您不能在未命名的命名空间中声明成员变量(除非类本身在未命名的命名空间中声明)。

引入了未命名的命名空间,以取代将变量声明为仅在一个编译单元中使用的静态变量的常见做法。

【讨论】:

  • 我的错,这些变量不再是成员变量,而是仅由该类使用,就好像它们是成员变量一样。
  • 它们不能用作成员变量,因为每个类只有一个实例。但是,它们可以像静态成员变量一样使用
猜你喜欢
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
相关资源
最近更新 更多