多个声明和定义

时间:2010-05-26 09:55:40

标签: c

X.c的内容:

int i;
main ()
{
fun ();
}

Y.c的内容:

int i;
fun ()
{
}

为什么这两个文件编译没有错误? (使用GCC)

但如果我使用int i = 10;,则会输出多重定义错误。

3 个答案:

答案 0 :(得分:3)

您可能对此问题和答案感兴趣。关键词:“暂定”。

Tentative definitions in C99 and linking

答案 1 :(得分:1)

假设您确实需要在这两个文件的每个文件中都使用名为i的独立变量,则需要在static前加上static int i = 10; ,以便为它们internal linkage.

{{1}}

如果您希望我在两个文件中都是相同的变量,那么一个中的更改会影响另一个,当您询问问题的变体时,请使用您given 3 hours ago的答案。如果要共享,则需要在一个地方定义变量。

至于为什么没有初始化它不会导致错误,我认为这是因为你没有使用变量,直到它需要初始化,所以编译器忽略它。

答案 2 :(得分:-1)

因为声明和定义之间存在差异。 int i;只会引入一个名字。另一方面,int i = 10;定义i,因此,必须保留存储器中的位置以存储它对应的值。但编译器无法知道哪个值对应i,因为您希望将两个内存位置与名称i相关联。

这是假设您将这些文件与其他文件相关联,这在您的解释中并不完全清楚。