我找不到关于未命名命名空间中的全局非静态变量的好解释。我尽可能地避免全局变量。在这个特殊情况下,我对纯粹理论方面的行为感兴趣。
假设以下代码:
在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();
}
}
如果我要创建两个实例 同一类Widget,都将 实例共享相同的变量x?
以上行为是否相同如果 类实例是相同的 线程与不同的线程?
如果变量x将是什么 自定义类型而不是内置 类型?
当变量x被构造和被破坏时?
sizeof(Widget)和这些变量之间是否有任何关系?
C ++标准中定义了哪些方面,哪些方面没有?
任何其他考虑因素,例如关于那个话题“需要知道”吗?也许任何人都可以提供好书参考(例如“Effective C ++ ..”)来阅读更多内容?
答案 0 :(得分:5)
如果我要创建两个实例 同一类Widget,都将 实例共享相同的变量x?
是的。这是一个全球变量。总是有一个 - 每个过程,就是这样。
如果上述行为相同 类实例是相同的 线程与不同的线程?
全局变量是全局 每个进程 (不是每个线程)。
如果变量x将是什么 自定义类型而不是内置 类型?
没关系。 (值得庆幸的是,C ++在内置函数和UDT之间没有什么区别。)
当变量x被构造和被破坏时?
在调用main()
之前构造,之后被破坏。跨多个翻译单元构造全局变量的顺序是不确定的。在同一个TU中,它是定义的顺序。 (或者声明?我忘记了。)破坏的顺序是明确定义的,并且一如既往地是逆向构造顺序。
sizeof(Widget)和这些变量之间是否有任何关系?
为什么类X
和不同类型的变量Y
之间存在关联?
C ++标准中定义了哪些方面,哪些方面没有?
基本上,未命名的命名空间中的全局变量是一个普通的全局变量。只有它位于具有“有趣”名称的命名空间中,您无法拼写出来并且其翻译单元是唯一的。
答案 1 :(得分:4)
x
。x
。x
。这与您将其定义为static
完全相同:文件中的全局,但隐藏在文件外部。
static int x;
namespace {
void Helper() {
}
}
专门添加了未命名的命名空间,以消除static
(具有太多不同的含义/用法)的特定用法。
答案 2 :(得分:0)
是肯定的。命名空间给'x'一个奇特的名字,但它仍然是全局范围内的静态对象。
也许。线程不是标准文档中描述的iso c ++虚拟机的一部分。 c ++如何与线程交互是一个实现定义的问题。大多数编译器都有某种declspec指令,使变量成为本地线程,否则所有线程共享同一个实例。
没有区别。
x是一个int。它的值是未定义/未初始化的。如果是一个类,它将在main()之前构造并在之后被破坏。
5& 6.不明白这个问题。
我有一个c ++问题的首选资源:c++ faq lite