【发布时间】:2010-05-26 09:55:39
【问题描述】:
X.c的内容:
int i;
main ()
{
fun ();
}
Y.c的内容:
int i;
fun ()
{
}
为什么这两个文件编译没有错误? (使用 GCC)
但如果我使用int i = 10;,它会打印出多重定义错误。
【问题讨论】:
标签: c
X.c的内容:
int i;
main ()
{
fun ();
}
Y.c的内容:
int i;
fun ()
{
}
为什么这两个文件编译没有错误? (使用 GCC)
但如果我使用int i = 10;,它会打印出多重定义错误。
【问题讨论】:
标签: c
您可能对此问题及其答案感兴趣。关键词:“暂定定义”。
【讨论】:
假设您确实想要在这两个文件中的每一个中都有一个名为 i 的独立变量,您需要在它们前面加上 static 以便给它们 internal linkage.
static int i = 10;
如果您希望 i 在两个文件中成为同一个变量,因此其中一个的更改会影响另一个,当您询问问题的变体时,请使用您的答案 given 3 hours ago。如果要共享,则需要在一处定义变量。
至于为什么没有初始化它不会导致错误,我认为那是因为您在需要初始化之前没有使用该变量,因此编译器忽略了它。
【讨论】:
因为声明和定义是有区别的。 int i; 只不过是介绍一个名字而已。另一方面,int i = 10; 定义了i,因此,必须在内存中保留一个位置来存储它对应的值。但是编译器不可能知道哪个值对应于i,因为您希望将两个内存位置与名称i 相关联。
这是假设您将这些文件相互链接,这从您的解释中并不完全清楚。
【讨论】:
int i;也是一个定义。