我找不到一个关于未命名命名空间中全局非静态变量的好解释。我尽可能避免使用全局变量。在这种情况下,我只是从纯理论的角度来看行为。
假设以下代码:
在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 ++..”),以便深入了解更多?
Widget
的大小如何与全局int
变量相关? - sbistatic
的作用(至少对于全局变量而言,static
还有很多其他含义)是修改变量的链接方式,使其仅在其翻译单元内可见(“内部链接”)。这曾经是为了防止与其他全局变量发生名称冲突。然而,static
仅为 变量 和 函数 提供此功能,而不适用于类型。这就是匿名命名空间的作用:它们提供了一种统一的方式来防止 任何 标识符发生名称冲突。 - sbi