未命名的命名空间中的全局非静态变量

时间:2010-08-19 15:09:40

标签: c++ namespaces

我找不到关于未命名命名空间中的全局非静态变量的好解释。我尽可能地避免全局变量。在这个特殊情况下,我对纯粹理论方面的行为感兴趣。

假设以下代码:

在a.h

namespace ai {
  class Widget {
    void DoSomething(int param);
  };
}

在a.cc

namespace {
  int x;
  void Helper() {
  }
}

namespace ai {
  void Widget::DoSomething(int param) {
    x = param;
    Helper();
  }
}
  1. 如果我要创建两个实例 同一类Widget,都将 实例共享相同的变量x?

  2. 以上行为是否相同如果 类实例是相同的 线程与不同的线程?

  3. 如果变量x将是什么 自定义类型而不是内置 类型?

  4. 当变量x被构造和被破坏时?

  5. sizeof(Widget)和这些变量之间是否有任何关系?

  6. C ++标准中定义了哪些方面,哪些方面没有?

  7. 任何其他考虑因素,例如关于那个话题“需要知道”吗?也许任何人都可以提供好书参考(例如“Effective C ++ ..”)来阅读更多内容?

3 个答案:

答案 0 :(得分:5)

  

如果我要创建两个实例       同一类Widget,都将       实例共享相同的变量x?

是的。这是一个全球变量。总是有一个 - 每个过程,就是这样。

  

如果上述行为相同       类实例是相同的       线程与不同的线程?

全局变量是全局 每个进程 (不是每个线程)。

  

如果变量x将是什么       自定义类型而不是内置       类型?

没关系。 (值得庆幸的是,C ++在内置函数和UDT之间没有什么区别。)

  

当变量x被构造和被破坏时?

在调用main()之前构造,之后被破坏。跨多个翻译单元构造全局变量的顺序是不确定的。在同一个TU中,它是定义的顺序。 (或者声明?我忘记了。)破坏的顺序是明确定义的,并且一如既往地是逆向构造顺序。

  

sizeof(Widget)和这些变量之间是否有任何关系?

为什么类X和不同类型的变量Y之间存在关联?

  

C ++标准中定义了哪些方面,哪些方面没有?

基本上,未命名的命名空间中的全局变量是一个普通的全局变量。只有它位于具有“有趣”名称的命名空间中,您无法拼写出来并且其翻译单元是唯一的。

答案 1 :(得分:4)

  1. 是的,只有一个变量x
  2. 是的,只有一个变量x
  3. 是的,只有一个变量x
  4. 启动时&关机。
  5. 我没有关注这个问题。
  6. 我相信上面的1-4是标准。
  7. 这与您将其定义为static完全相同:文件中的全局,但隐藏在文件外部。

    static int x; 
    namespace { 
      void Helper() { 
      } 
    }
    

    专门添加了未命名的命名空间,以消除static(具有太多不同的含义/用法)的特定用法。

答案 2 :(得分:0)

  1. 是肯定的。命名空间给'x'一个奇特的名字,但它仍然是全局范围内的静态对象。

  2. 也许。线程不是标准文档中描述的iso c ++虚拟机的一部分。 c ++如何与线程交互是一个实现定义的问题。大多数编译器都有某种declspec指令,使变量成为本地线程,否则所有线程共享同一个实例。

  3. 没有区别。

  4. x是一个int。它的值是未定义/未初始化的。如果一个类,它将在main()之前构造并在之后被破坏。

  5. 5& 6.不明白这个问题。

    我有一个c ++问题的首选资源:c++ faq lite