Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 每个文件都有自己的静态变量副本吗?_C++ - Fatal编程技术网

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

C++ 每个文件都有自己的静态变量副本吗?,c++,C++,假设头文件中有一个静态全局变量,并且在main.cpp中使用该变量 // header.h static int variableOne = 100; //main.cpp . . cout << variableOne << endl; //header.h 静态整数变量1=100; //main.cpp . . cout在这种情况下,每个编译模块将获得它自己的变量副本 如果使用extern,则只有一个副本。但您只能在一个模块中初始化它 换句话说,

假设头文件中有一个静态全局变量,并且在main.cpp中使用该变量

// 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;