【问题标题】:Multiple declarations and definitions多个声明和定义
【发布时间】:2010-05-26 09:55:39
【问题描述】:

X.c的内容:

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

Y.c的内容:

int i;
fun ()
{
}

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

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

【问题讨论】:

标签: c


【解决方案1】:

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

Tentative definitions in C99 and linking

【讨论】:

    【解决方案2】:

    假设您确实想要在这两个文件中的每一个中都有一个名为 i 的独立变量,您需要在它们前面加上 static 以便给它们 internal linkage.

    static int i = 10;
    

    如果您希望 i 在两个文件中成为同一个变量,因此其中一个的更改会影响另一个,当您询问问题的变体时,请使用您的答案 given 3 hours ago。如果要共享,则需要在一处定义变量。

    至于为什么没有初始化它不会导致错误,我认为那是因为您在需要初始化之前没有使用该变量,因此编译器忽略了它。

    【讨论】:

      【解决方案3】:

      因为声明和定义是有区别的。 int i; 只不过是介绍一个名字而已。另一方面,int i = 10; 定义了i,因此,必须在内存中保留一个位置来存储它对应的值。但是编译器不可能知道哪个值对应于i,因为您希望将两个内存位置与名称i 相关联。

      这是假设您将这些文件相互链接,这从您的解释中并不完全清楚。

      【讨论】:

      • 不,int i;也是一个定义。
      • 确实,我误解了他的例子,对不起。
      • 我很困惑,这是定义吗?
      猜你喜欢
      • 2020-09-18
      • 2020-01-14
      • 2013-05-28
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多