C++ 每个文件都有自己的静态变量副本吗?
假设头文件中有一个静态全局变量,并且在main.cpp中使用该变量C++ 每个文件都有自己的静态变量副本吗?,c++,C++,假设头文件中有一个静态全局变量,并且在main.cpp中使用该变量 // header.h static int variableOne = 100; //main.cpp . . cout << variableOne << endl; //header.h 静态整数变量1=100; //main.cpp . . cout在这种情况下,每个编译模块将获得它自己的变量副本 如果使用extern,则只有一个副本。但您只能在一个模块中初始化它 换句话说,
// header.h
static int variableOne = 100;
//main.cpp
.
.
cout << variableOne << endl;
//header.h
静态整数变量1=100;
//main.cpp
.
.
cout在这种情况下,每个编译模块将获得它自己的变量副本
如果使用extern
,则只有一个副本。但您只能在一个模块中初始化它
换句话说,如果您在示例中只是将static
替换为extern
,它不会编译,因为它正在包含该头文件的每个模块中初始化。如果在头文件中声明一个静态变量,那么将在包含头文件的每个中创建该变量的副本
因此,决不在头文件中声明静态变量
另外,C++03标准:7.3.1.1/2规定:
当在命名空间范围中声明对象时,不推荐使用static
关键字
提供了一个更好的选择
C++03标准:7.3.1.1/1规定:
“[a]l尽管未命名命名空间中的实体可能具有外部链接,但它们实际上是由其翻译单元特有的名称限定的,因此从任何其他翻译单元都看不到。”
简单地说,未命名名称空间
通过名称损坏将其成员的可见性限制在翻译单元的范围内,并避免使用静态
关键字时遇到的问题
此外,不能在变量上同时使用关键字static
和extern
,因为两者都旨在实现互斥行为。static
命名空间范围中的变量不是外部变量,因此,您可以为项目中的每个“翻译单元”获取静态变量的副本。这种技术从C++03开始就被淘汰了,现在推荐的方法是将变量封装在一个未命名的名称空间中。每个源文件都将获得自己的variableOne
的独立副本
最后一次使用static是作为代码文件中的全局变量。
在这种情况下,使用static表示源代码在其他
作为项目一部分的文件无法访问该变量。只有
单个文件中的代码可以看到变量
如果使用extern
所有源文件都将引用同一个变量,但您将无法在标头中对其进行初始化。您必须将初始化添加到其中一个源文件。1。这意味着什么
编写#include“header.h”
时,编译器基本上只是复制文件的全部内容,而不是该行。在C++中,头文件没有语义意义,它只是用于文本替换。
所以如果你有
---- header.h ----
static int variableOne = 100;
---- main.cpp ----
#include "header.h"
...
std::cout << variableOne << std::endl;
----header.h----
静态整数变量1=100;
----main.cpp----
#包括“header.h”
...
std::回答不好,但应该使用“翻译单位”而不是“模块”。@6502回答很好。非常有用。它教会了我头文件在做什么。再次感谢!你最近帮了我很多忙!!谢谢你的帮助。我喜欢:)非常感谢。从你那里学到了一种新技术。
---- main.cpp ----
static int variableOne = 100;
...
std::cout << variableOne << std::endl;