头文件中的全局变量

时间:2014-06-09 10:17:04

标签: c include global-variables header-files c89

有一个包含全局变量声明foo.h的头文件int i;。这个头文件分别包含在one.ctwo.c中(我知道这不是一个非常好的生活选择,但它不是我的。)

  1. 这是否意味着每个* .c文件中存在两个名称为i的不同变量?

  2. 本例中的声明/定义是什么情况(按照标准)?

4 个答案:

答案 0 :(得分:4)

是的,两个编译单元中都存在带有外部链接的全局变量i。这将在链接阶段产生冲突错误。

在理想情况下,foo.h标题应仅包含声明:extern int i;且实际定义int i;应仅存在于一个 .c文件中。

其他替代方法是在static int i;中使用foo.h。这将使用内部链接创建i,这意味着变量在包含标头的每个编译单元上是本地的。但是,在标头中声明static变量通常被认为是一种不好的做法。

答案 1 :(得分:1)

当您将头文件包含在另一个文件中时,直到它们一次编译,即它们是单个翻译单元,您不会收到错误。但是如果你必须编译这两个文件,即

gcc -c one.c two.c

然后是的,你遇到了麻烦。

它与声明/定义无关。使用static来为有问题的变量设置文件范围或更改设计。

答案 2 :(得分:0)

对于变量的多个定义,您将收到链接器错误。

答案 3 :(得分:0)

您将遇到链接器错误。

请搜索“extern”关键字。