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
我在两个头文件中都声明了静态变量say
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
,不要忘记in
var1.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;

正如您所知,这是无效的。

我的想法是,将有两个编译单元。感谢可疑者的澄清相关,请参阅