C语言中声明和定义的混淆问题

6

这个答案让我感到困惑。

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

extern int c;
int c;
  • 第一行代码是声明,第二行是定义吗?
  • 两者都是声明吗?
  • 这两行代码有什么区别?

第一个意思是在某处将 c 定义为 int - LPs
两者都是声明。根据它的位置,第二个也可以是定义,或者是一个试探性的定义。 - too honest for this site
4个回答

1
< p > extern 关键字使第一行成为声明。它表示“这个变量存在于某处”。这样的一行可以出现在头文件中。

第二行是定义,因为没有 extern 关键字。如果你将这一行放在头文件中,包含该头文件的两个源文件都将定义该变量,并链接这两个文件将导致变量重新定义错误。


1
当你编写的程序由多个源文件链接在一起时,其中一些变量在源文件file1.c中定义,需要在其他源文件中引用,这就是使用extern的原因。
关于你的问题,这些行有何不同:
extern int c;
int c;
  • 当编译器分配变量的存储空间时,变量被定义;

  • 当编译器得知变量存在(并确定其类型)时,变量被声明;此时不会分配变量的存储空间。

因此,只有int c;被定义,而extern int c;被声明。


0

长话短说,定义某物意味着提供所有必要的信息来创建该物体。然而,声明某物只是为了让计算机知道其存在

编辑: 更明确地说:定义既定义又声明,声明仅仅声明。当你使用 extern 关键字时,根据定义,你没有定义任何东西。你的困惑源于对 extern 的理解。


那不回答问题。 - too honest for this site
它仍然缺少一些东西。声明一个对象存在并不仅仅是这样告诉它。提示:对于这种情况,类似于“extern my_variable;”的语句就足够了(这在汇编语言中很典型)。 - too honest for this site

0

定义会为变量创建空间:

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的含义以及前向声明的含义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接