【问题标题】:Declaration and definition confusion in CC中的声明和定义混淆
【发布时间】:2016-10-05 12:42:29
【问题描述】:

这个answer让我很困惑。

如果我们在同一个 .c 文件中有两行:

extern int c;
int c;
  • 第一行代码如何声明,第二行定义?
  • 不是两个声明吗?
  • 这两行有何不同?

【问题讨论】:

  • 第一个表示某处`c`被定义为int
  • 两者都是声明。根据放置位置,第二个是也是定义,或暂定定义

标签: c external public extern


【解决方案1】:

extern 关键字使第一行成为声明。它说“这个变量存在于某处”。这样的一行可以出现在头文件中。

第二行是一个定义,因为extern 关键字不存在。如果您将这一行放在头文件中,则包含该头文件的两个源文件都将定义该变量,链接这两个文件将导致变量重新定义错误。

【讨论】:

    【解决方案2】:

    定义为变量创建空间:

    int c;
    

    无论你把这行放在哪里,无论是本地的还是全局的,这表示int 类型的新变量c 将会生效。

    extern int c;
    

    声明说在其他地方有一些c 类型为int 的变量。通过使用extern,您说c 是在其他地方定义的。如果您只在其他地方放置了 extern 声明而没有定义,则会出现链接错误。使用 extern 相当于函数的前向声明:

    /* declaration */
    int f(int x);
    

    对比

    /* definition */
    int f(int x) {
      return x*x;
    }
    

    第一个意味着某处有一个函数f 返回一个int 并接受一个int 作为参数。后者是实际的函数,它的代码,既可以作为声明,也可以作为定义。

    IMO,这种声明与定义的命名令人困惑。我几乎不记得哪个是什么,我通常需要考虑一下。但是,您应该了解 extern 的含义以及前向声明的含义。

    【讨论】:

      【解决方案3】:

      当您编写的程序由多个链接在一起的源文件组成时,其中一些定义的变量,例如在源文件file1.c中定义的变量需要在其他源文件中引用,所以这就是为什么使用外部。

      关于您的问题,这些行有何不同:

      extern int c;
      int c;
      
      • 当编译器为 变量而

      • 当通知编译器一个变量时声明一个变量 存在(这是它的类型);它不为 那个时候的变量。

      所以只有int c; 被定义,而extern int c; 被声明。

      【讨论】:

        【解决方案4】:

        长话短说,定义某事意味着提供所有必要的信息以完整地创建该事物。但是,声明意味着只提供足够的信息让计算机知道它存在

        编辑:为了更清楚:定义既定义又声明,声明ONLY声明。当您根据定义使用 extern 关键字时,您没有定义任何内容。您的困惑源于the understandingextern

        【讨论】:

        • 这没有回答问题。
        • 它仍然缺少一些东西。声明不仅仅是告诉对象存在。提示:为此,extern my_variable; 之类的内容就足够了(这对于汇编语言很典型)。
        猜你喜欢
        • 2010-11-24
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 2011-08-06
        • 2015-04-29
        相关资源
        最近更新 更多