有一个包含全局变量声明foo.h
的头文件int i;
。这个头文件分别包含在one.c
和two.c
中(我知道这不是一个非常好的生活选择,但它不是我的。)
这是否意味着每个* .c文件中存在两个名称为i
的不同变量?
本例中的声明/定义是什么情况(按照标准)?
答案 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
”关键字。