C++ 头文件中的静态变量
静态变量具有文件作用域。假设我有以下两个文件:C++ 头文件中的静态变量,c++,one-definition-rule,C++,One Definition Rule,静态变量具有文件作用域。假设我有以下两个文件: 文件1.h file1.cpp 文件2.h file2.cpp 我在两个头文件中都声明了静态变量saystatic int Var1。file1.h和file2.h都包含在main.cpp文件中 我这样做是因为静态变量将具有文件作用域,所以它不会相互冲突。 但在编译之后,我发现它显示出冲突 现在,静态变量的行为类似于extern变量。另一方面,如果我在两个.cpp文件中都声明了静态变量,那么它可以很好地编译 我无法理解这种行为 任何人都可以解释
- 文件1.h
- file1.cpp
- 文件2.h
- file2.cpp
static int Var1
。file1.h
和file2.h
都包含在main.cpp
文件中
我这样做是因为静态变量将具有文件作用域,所以它不会相互冲突。
但在编译之后,我发现它显示出冲突
现在,静态变量的行为类似于extern
变量。另一方面,如果我在两个.cpp文件中都声明了静态变量,那么它可以很好地编译
我无法理解这种行为
任何人都可以解释在这种情况下作用域和链接是如何工作的。静态变量是编译单元的局部变量。编译单元基本上是一个
.cpp
文件,在每个#include
指令中插入.h
文件的内容
现在,在编译单元中,不能有两个同名的全局变量。这就是在您的案例中发生的情况:main.cpp
包括file1.h
和file.h
,这两个头分别定义了自己的Var1
如果逻辑上这是两个不同的变量,则为它们指定不同的名称(或将它们放在不同的名称空间中)
如果这些变量相同,请将其移动到单独的头文件
var1.h
,并从file1.h
和file2.h
中包含var1.h
,不要忘记invar1.h
假设静态变量static int var1
在两个头中都处于全局范围,并且都包含在main.cpp
中。现在,前置处理器首先将包含文件的内容复制到main.cpp
。由于在main.cpp
中,在同一范围内有Var1
声明两次,因此会出现多个声明错误。(即,预处理器从file1.h
复制一份,另一份从file2.h
复制)
每个源文件都是单独编译的。现在,当您在它们的源文件中分别声明时,每个源文件都不知道在另一个具有相同名称的源文件中存在另一个静态变量。所以,编译器不会报告错误。如果希望在源文件之间共享变量,可以将其标记为extern。静态变量具有翻译单元范围(通常是
.c
或.cpp
文件),但#include
指令只是逐字复制文件的文本,而不创建另一个翻译单元。预处理后,这将:
#include "file1.h"
#include "file2.h"
将变成这样:
/* file1.h contents */
static int Var1;
/* file2.h contents */
static int Var1;
正如您所知,这是无效的。我的想法是,将有两个编译单元。感谢可疑者的澄清相关,请参阅