C中的声明和定义混淆

Declaration and definition confusion in C

这个answer让我很困惑。

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

extern int c;
int c;

长话短说,定义 某物意味着提供所有必要的信息 来完整地创建那个东西。然而,声明某物意味着只提供足够的信息让计算机知道它存在

编辑: 更清楚:定义既定义又声明,声明 ONLY 声明。当您根据定义使用 extern 关键字时,您没有定义任何东西。您的困惑源于 externthe 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;