错误:在C头文件中重新定义了“静态变量”

时间:2018-07-02 12:10:20

标签: c variables static header-files static-initialization

我在两个不同的文件中声明了一些静态变量(例如var1和var2)。这两个文件中的变量名称相同。有些变量(例如var1)未在其声明中初始化,有些变量(例如var2),如下所示。

file1.h

static bool var1;
static bool var2 = false;

file2.h

static bool var1;
static bool var2 = false;

根据我的理解,静态变量仅限于在其声明的c文件(或h文件)中使用,因此我应该放心在多个头文件中使用相同的变量名。但是,当我编译代码时,仅对于已初始化的变量,我会收到错误“ var2的重新定义”。

  1. 为什么仅对于var2会发生此错误?
  2. 我的实现还好吗?

编辑: 因为有人提到使用extern关键字,所以我想澄清一下,var1和var2在不同的c文件中应该具有不同的值,并且应该仅限于各自的文件,

3 个答案:

答案 0 :(得分:1)

不。 var1的多重声明是可以的,但是var2的多重定义是不可行的。您不能两次初始化变量...即使值相同。

我使用预处理器防护措施解决了此类问题,例如:

#if !defined(MY_APP__VARS_DEFINED)
static int var1, var2=0;
#define MY_APP__VARS_DEFINED
#endif

即使那样,我也不建议在多个头文件中复制定义。这是维护问题。迟早,某人可能会在一个标头中更改该初始值,而找不到其定义的所有其他标头。这也使重命名(“重构”)更加困难。 (...并违反了DRY Principle。)

不过,您可能想重新考虑您的设计。全局变量通常导致应用程序易碎;难以维护且易于破坏。

答案 1 :(得分:0)

为什么仅在var2中发生此错误?如果您在同一源文件file1.h中包含file2.htest.cpp,那么var2将会具有两种定义,编译器无法选择采用哪一种并引发错误。

为避免这种情况,请将var2声明为头文件extern中的.h,并在相应的源.cpp文件中进行定义。

在使用var1的情况下,只是declaration而不是definition,因此不会引发错误,即可以进行多个声明。

也像static声明

static bool var1;

意味着变量var1仅在当前编译单元中可见。

旁注static具有内部链接的变量,即它对其他翻译单元隐藏了static变量。尽管static变量可以是defined的多个翻译单位。

具有外部链接的extern变量,即extern变量对其他翻译单元可见,但extern变量应仅在一个翻译单元中定义。

答案 2 :(得分:0)

如果源文件同时包含file1.h和file2.h,则它将具有var2的多个定义。这就是导致错误的原因。

与其在头文件中声明/定义这些静态变量,不如将它们直接放在必要的C源文件中。这样,您就不必处理多个定义。