C中的声明和定义混淆
Declaration and definition confusion in C
这个answer让我很困惑。
如果我们在同一个 .c 文件中有两行:
extern int c;
int c;
- 如何第一行代码是声明,第二行代码是定义?
- 不都是声明吗?
- 这两条线有何不同?
长话短说,定义 某物意味着提供所有必要的信息 来完整地创建那个东西。然而,声明某物意味着只提供足够的信息让计算机知道它存在。
编辑: 更清楚:定义既定义又声明,声明 ONLY 声明。当您根据定义使用 extern
关键字时,您没有定义任何东西。您的困惑源于 extern
的 the understanding。
extern
关键字使第一行成为声明。它说 "this variable exists somewhere"。像这样的一行可以出现在头文件中。
第二行是定义,因为 extern
关键字不存在。如果您将此行放在头文件中,则包含该头文件的两个源文件都将定义该变量,并且链接这两个文件将导致变量重新定义错误。
A 定义 为变量创建 space:
int c;
无论您将此行放在哪里,无论是本地的还是全局的,这都表示类型 int
的新变量 c
将会生效。
extern int c;
一个声明说在其他地方有一些类型int
的变量c
。通过使用 extern
,您说 c
是在其他地方定义的。如果您只在其他地方放置一个没有定义的 extern
声明,则会出现 link 错误。使用 extern 相当于函数的前向声明:
/* declaration */
int f(int x);
对比
/* definition */
int f(int x) {
return x*x;
}
第一个意味着某处有一个函数 f
返回一个 int
并接受一个 int
作为参数。后者是实际的功能,它的代码,它也可以作为声明和定义。
IMO,这种声明与定义的命名方式令人困惑。我几乎不记得哪一个是什么,我通常需要考虑一下。但是,您应该了解 extern
的含义以及前向声明是什么。
当您编写的程序由多个链接在一起的源文件组成时,其中一些定义的变量,例如在源文件file1.c中定义的变量需要在其他源文件中引用,所以这是使用 extern.
的原因
关于您的问题,这些行有何不同:
extern int c;
int c;
编译器为
变量 while
当编译器被告知一个变量
存在(这是它的类型);它不分配存储空间
那个点的变量。
因此在声明 extern int c;
时仅定义了 int c;
。
这个answer让我很困惑。
如果我们在同一个 .c 文件中有两行:
extern int c;
int c;
- 如何第一行代码是声明,第二行代码是定义?
- 不都是声明吗?
- 这两条线有何不同?
长话短说,定义 某物意味着提供所有必要的信息 来完整地创建那个东西。然而,声明某物意味着只提供足够的信息让计算机知道它存在。
编辑: 更清楚:定义既定义又声明,声明 ONLY 声明。当您根据定义使用 extern
关键字时,您没有定义任何东西。您的困惑源于 extern
的 the understanding。
extern
关键字使第一行成为声明。它说 "this variable exists somewhere"。像这样的一行可以出现在头文件中。
第二行是定义,因为 extern
关键字不存在。如果您将此行放在头文件中,则包含该头文件的两个源文件都将定义该变量,并且链接这两个文件将导致变量重新定义错误。
A 定义 为变量创建 space:
int c;
无论您将此行放在哪里,无论是本地的还是全局的,这都表示类型 int
的新变量 c
将会生效。
extern int c;
一个声明说在其他地方有一些类型int
的变量c
。通过使用 extern
,您说 c
是在其他地方定义的。如果您只在其他地方放置一个没有定义的 extern
声明,则会出现 link 错误。使用 extern 相当于函数的前向声明:
/* declaration */
int f(int x);
对比
/* definition */
int f(int x) {
return x*x;
}
第一个意味着某处有一个函数 f
返回一个 int
并接受一个 int
作为参数。后者是实际的功能,它的代码,它也可以作为声明和定义。
IMO,这种声明与定义的命名方式令人困惑。我几乎不记得哪一个是什么,我通常需要考虑一下。但是,您应该了解 extern
的含义以及前向声明是什么。
当您编写的程序由多个链接在一起的源文件组成时,其中一些定义的变量,例如在源文件file1.c中定义的变量需要在其他源文件中引用,所以这是使用 extern.
的原因关于您的问题,这些行有何不同:
extern int c;
int c;
编译器为 变量 while
当编译器被告知一个变量 存在(这是它的类型);它不分配存储空间 那个点的变量。
因此在声明 extern int c;
时仅定义了 int c;
。