头文件中的静态变量

Chr*_*_vr 8 c++ one-definition-rule

静态变量具有文件范围.说我有两个以下文件:

  • file1.h
  • file1.cpp
  • file2.h
  • file2.cpp

我已static int Var1在两个头文件中声明了静态变量.双方file1.hfile2.h都包含在main.cpp文件中.

我这样做是因为静态变量将具有文件范围,因此它不会相互冲突.但在编译后我发现它显示出冲突.

现在静态变量的行为就像一个extern变量.另一方面,如果我在两个.cpp文件中声明静态变量,它编译得很好.

我无法理解这种行为.

任何机构都可以解释范围和链接在这种情况下的工作方式.

NPE*_*NPE 16

静态变量是编译单元的本地变量.编译单元基本上是一个.cpp文件,其中.h插入的文件内容代替每个#include指令.

现在,在编译单元中,您不能拥有两个具有相同名称的全局变量.这就是你的情况:main.cppinclude file1.hfile.h,并且两个头中的每一个都定义了它自己的Var1.

如果逻辑上这些是两个不同的变量,请为它们指定不同的名称(或将它们放在不同的名称空间中).

如果这些是相同的变量,将其移动到一个单独的头文件,var1.h和包括var1.h来自两个file1.hfile2.h,不要忘记的#include后卫var1.h.

  • 您提供了我所发现的_编译单元_的最佳和最简单的定义:“_编译单元_基本上是一个.cpp文件,其中插入了.h文件的内容来代替每个`#include`指令。” (4认同)

moa*_*lon 9

静态变量具有转换单元范围(通常是文件.c.cpp文件),但是#include指令只是逐字复制文件的文本,而不创建另一个转换单元.预处理后,这个:

#include "file1.h"
#include "file2.h"
Run Code Online (Sandbox Code Playgroud)

将变成这样:

/* file1.h contents */
static int Var1;

/* file2.h contents */
static int Var1;
Run Code Online (Sandbox Code Playgroud)

如你所知,这是无效的.