[英]Declaration and definition confusion in 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
含义以及什么是前向声明。
当您正在编写的程序由链接在一起的多个源文件组成时,需要在其他源文件中引用例如在源文件file1.c中定义的某些变量,因此这就是使用extern的原因。
关于您的问题,这些行有何不同:
extern int c;
int c;
当编译器为变量分配存储空间时定义了一个变量
当编译器被告知存在一个变量(这就是它的类型)时,就声明一个变量。 此时,它不会为变量分配存储空间。
所以只有int c;
在extern int c;
定义extern int c;
被宣告。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.