头文件中的静态变量

新手上路,请多包涵

静态变量具有文件范围。假设我有以下两个文件:

  • 文件1.h
  • 文件1.cpp
  • 文件2.h
  • 文件2.cpp

我在两个头文件中都声明了静态变量 static int Var1file1.hfile2.h 都包含在 main.cpp 文件中。

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

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

我无法理解这种行为。

任何机构都可以解释范围和链接在这种情况下是如何工作的。

原文由 Vikram Ranabhatt 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 625
2 个回答

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

现在,在一个编译单元中,你不能有两个同名的全局变量。 This is what’s happening in your case: main.cpp includes file1.h and file.h , and each of the two headers defines its own Var1 .

如果在逻辑上它们是两个不同的变量,请给它们不同的名称(或将它们放在不同的名称空间中)。

如果这些是相同的变量,请将其移至单独的头文件 var1.h 中,并包括 var1.h 来自 file1.hfile2.h 不要忘记 var1.h 中的 #include 保护

原文由 NPE 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 #include "file1.h"
#include "file2.h"

会变成这样:

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

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

如您所知,这是无效的。

原文由 moatPylon 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题