extern
关键字使第一行成为声明。它表示“这个变量存在于某处”。这样的一行可以出现在头文件中。
第二行是定义,因为没有 extern
关键字。如果你将这一行放在头文件中,包含该头文件的两个源文件都将定义该变量,并链接这两个文件将导致变量重新定义错误。
extern int c;
int c;
当编译器分配变量的存储空间时,变量被定义;
当编译器得知变量存在(并确定其类型)时,变量被声明;此时不会分配变量的存储空间。
因此,只有int c;
被定义,而extern int c;
被声明。
长话短说,定义某物意味着提供所有必要的信息来创建该物体。然而,声明某物只是为了让计算机知道其存在。
编辑: 更明确地说:定义既定义又声明,声明仅仅声明。当你使用 extern
关键字时,根据定义,你没有定义任何东西。你的困惑源于对 extern 的理解。
定义会为变量创建空间:
int c;
int
的变量c
将会被创建。extern int c;
声明表示在其他地方有一个类型为int
的变量c
。使用extern
,您可以说明c
在其他地方被定义。如果只使用extern
声明而没有在其他地方进行定义,则会出现链接错误。使用extern相当于函数的前向声明:
/* declaration */
int f(int x);
对比。
/* definition */
int f(int x) {
return x*x;
}
第一个意味着某处有一个函数f
,返回一个int
并接受一个int
作为参数。后者是实际的函数,它的代码也可以作为声明和定义。
在我看来,这种声明与定义的命名方式很令人困惑。我几乎不记得哪个是哪个,通常需要思考一下。但是,您应该了解extern
的含义以及前向声明的含义。
c
定义为int
。 - LPs