假设您的头文件中有一个静态全局变量,并在main.cpp中使用此变量.
// header.h
static int variableOne = 100;
//main.cpp
.
.
cout << variableOne << endl;
Run Code Online (Sandbox Code Playgroud)
main.cpp会得到自己的variableOne副本(虽然值仍然是100 ......)?或者我将这个概念与extern混合(我知道extern告诉编译器,variableOne是在项目的其他地方定义的......)
谢谢.
如果static在头文件中声明变量,则将在包含头文件的每个转换单元中创建该变量的副本.
所以永远不要在Header File中声明一个静态变量.
另外,C++ 03标准:7.3.1.1/2说:
static在声明命名空间作用域中的对象时,不推荐使用该关键字, unnamed-namespace提供了一种更好的替代方法.
C++ 03标准:7.3.1.1/1说:
"虽然未命名的命名空间中的实体可能具有外部链接,但它们实际上由其翻译单元特有的名称限定,因此永远不会从任何其他翻译单元中看到."
简单来说,通过名称修改来unnamed namespace限制其成员对翻译单元范围的可见性,并避免使用static关键字时遇到的问题.
此外,您不能在变量上使用关键字static,extern因为两者都旨在实现互斥行为.
在这种情况下,每个编译模块都将获得它自己的变量副本.
如果使用extern,则只有一个副本.但是只允许在一个模块中初始化它.
换句话说,如果你只是更换static与extern你的榜样,它不会编译,因为它的每一个包括头模块进行初始化.