c - 错误 : redefinition of "a static variable" in C header files

标签 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 文件),因此在多个头文件中使用相同的变量名应该是安全的。但是当我编译代码时,我得到错误“redefinition of var2”,仅针对已初始化的变量。

  1. 为什么这个错误只发生在 var2 上?
  2. 我的实现没问题吗?

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

最佳答案

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

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

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

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

不过,您可能需要重新考虑您的设计。全局变量通常会导致脆弱的应用程序;更难维护且容易损坏。

关于c - 错误 : redefinition of "a static variable" in C header files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51135935/

相关文章:

c - 无法将 libusb 链接到 Mac 上的 C 项目

c - 在内核模块中以秒为单位获取当前时间

c - 使用数组和双向链表存储书籍的数据结构

variables - Oracle PL/SQL : How to find unused variables in a long package?

bash - 在 bash 中使用/dev/random 分配一个具有 10 个字符长的随机字符串的变量?

regex - AS3将动态变量包含到regexp对象中

c++ - 在 C++ 中,如果成员函数是虚拟的,什么时候可以使用静态绑定(bind)?

Java - 使用 Comparable 的静态泛型类型

static - 如何在一行 Nuxt.js 中缩小 HTML 代码?

c - 为什么我不能编辑 char* 中的 char?