【发布时间】:2016-10-05 12:42:29
【问题描述】:
【问题讨论】:
-
第一个表示某处`c`被定义为
int。 -
两者都是声明。根据放置位置,第二个是也是定义,或暂定定义。
【问题讨论】:
int 。
extern 关键字使第一行成为声明。它说“这个变量存在于某处”。这样的一行可以出现在头文件中。
第二行是一个定义,因为extern 关键字不存在。如果您将这一行放在头文件中,则包含该头文件的两个源文件都将定义该变量,链接这两个文件将导致变量重新定义错误。
【讨论】:
定义为变量创建空间:
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 的含义以及前向声明的含义。
【讨论】:
当您编写的程序由多个链接在一起的源文件组成时,其中一些定义的变量,例如在源文件file1.c中定义的变量需要在其他源文件中引用,所以这就是为什么使用外部。
关于您的问题,这些行有何不同:
extern int c;
int c;
当编译器为 变量而
当通知编译器一个变量时声明一个变量 存在(这是它的类型);它不为 那个时候的变量。
所以只有int c; 被定义,而extern int c; 被声明。
【讨论】:
长话短说,定义某事意味着提供所有必要的信息以完整地创建该事物。但是,声明意味着只提供足够的信息让计算机知道它存在。
编辑:为了更清楚:定义既定义又声明,声明ONLY声明。当您根据定义使用 extern 关键字时,您没有定义任何内容。您的困惑源于the understanding 的extern。
【讨论】:
extern my_variable; 之类的内容就足够了(这对于汇编语言很典型)。