C 共享头文件中定义的变量?

C 共享头文件中定义的变量?,c,header-files,C,Header Files,在头文件“foo.h”中,有以下语句: int foo; 在源文件“a.c”和“b.c”中,包含头文件 #include "foo.h" 在两个地方有两个独立的foo,还是只有一个foo在“a.c”和“b.c”之间共享?我看到这发生在其他人共享的一段代码中。如果您能理解这一点,请提前感谢。多次定义外部对象将导致错误 使用extern-int-foo和intfoo正好在一个.c文件中 文件范围中的extern说明符(如果没有初始值设定项)声明而不进行定义。预处理器只是将#include“foo

在头文件“foo.h”中,有以下语句:

int foo;
在源文件“a.c”和“b.c”中,包含头文件

#include "foo.h"

在两个地方有两个独立的foo,还是只有一个foo在“a.c”和“b.c”之间共享?我看到这发生在其他人共享的一段代码中。如果您能理解这一点,请提前感谢。

多次定义外部对象将导致错误

使用
extern-int-foo
intfoo
正好在一个
.c
文件中


文件范围中的
extern
说明符(如果没有初始值设定项)声明而不进行定义。

预处理器只是将
#include“foo.h”
的内容替换为
foo.h


它完全等同于
a.c
b.c
包含
int-foo

这不完全正确。我现在正在重构代码,而这正是它正在做的。没有错误。@UmNyobe您没有得到错误并不意味着它是正确的。C表示多对象定义是未定义的行为(参见C99,6.9p5):实现不必触发错误消息,但程序仍然是错误的C程序。现在这也是一个常见的C扩展(在C99J.5扩展中非常常见),它认为它适合一个暂定的定义。这意味着链接器会看到几个
intfoo
并确定所有这些定义都是同一对象的定义。我用elf阅读器查看了.o和可执行文件的内部,以获得确认。@UmNyobe如果多个
intfoo
位于同一个
.c
文件中:您将有多个有效的暂定定义。但是这里有多个
intfoo在不同的
.c
文件中:这意味着在每个源文件的末尾,所有暂定定义都会导致创建一个定义,并且最终会得到多个对象定义。