每个文件都有自己的静态变量副本吗?

Cpp*_*ner 2 c++

假设您的头文件中有一个静态全局变量,并在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是在项目的其他地方定义的......)

谢谢.

Alo*_*ave 6

如果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因为两者都旨在实现互斥行为.


Mys*_*ial 5

在这种情况下,每个编译模块都将获得它自己的变量副本.

如果使用extern,则只有一个副本.但是只允许在一个模块中初始化它.

换句话说,如果你只是更换staticextern你的榜样,它不会编译,因为它的每一个包括头模块进行初始化.