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

12 浏览
0 Comments

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

这个回答让我感到困惑。

如果在同一个.c文件中有两行代码:

extern int c;
int c;

  • 第一行代码是声明,第二行是定义,它们有什么区别?
  • 难道不都是声明吗?
  • 这两行代码有何不同?
0
0 Comments

在C语言中,"声明"和"定义"的概念容易混淆。声明是指在某处存在一个具有特定类型的变量,而定义则是在内存中为变量分配空间。如果只有一个extern声明而没有在其他地方进行定义,就会出现链接错误。

为了更好地理解这个问题,可以将其类比为函数的前向声明。函数的前向声明可以理解为声明,而函数的实际代码则可以理解为定义。例如,int f(int x)是一个前向声明,表示在某处存在一个返回int类型、接受int类型参数的函数f。而int f(int x) { return x*x; }则是函数的定义,包含了函数的实际代码。

个人认为,声明和定义的命名方式很容易混淆。我很难记住哪个是哪个,通常需要思考一下。但是,我们应该理解extern的含义以及前向声明的概念。

0
0 Comments

在C语言中,当编写的程序由多个源文件链接在一起时,其中一些在源文件file1.c中定义的变量需要在其他源文件中引用,这就是使用extern的原因。

关于你提出的这两行代码有什么不同:

extern int c;
int c;

  • 当编译器为变量分配存储空间时,变量被定义。
  • 当编译器被告知变量存在(以及它的类型)时,变量被声明;此时并不为变量分配存储空间。

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

0
0 Comments

在C语言中,声明和定义的混淆是由于使用extern关键字的原因造成的。该关键字使得第一行成为了一个声明,它的意思是"这个变量在某个地方存在"。这样的一行代码可以出现在一个头文件中。

而第二行则是一个定义,因为没有使用extern关键字。如果你将这样的一行代码放在一个头文件中,那么包含这个头文件的两个源文件都会定义这个变量,而将这两个文件链接在一起会导致变量重定义错误。

解决方法是在头文件中使用extern关键字声明变量,在源文件中定义变量。这样,当多个源文件包含同一个头文件时,每个源文件中只会定义一次变量,避免了变量重定义错误的问题。

下面是一个示例代码,演示了如何正确地使用声明和定义:

// header.h
extern int variable; // 在头文件中声明变量
// file1.c
#include "header.h"
int variable = 10; // 在源文件中定义变量
// file2.c
#include "header.h"
// 不需要再次定义变量,直接使用即可

通过这种方式,我们可以避免在多个源文件中重复定义同一个变量而导致的错误。声明和定义的使用方式清晰明了,提高了代码的可读性和可维护性。

0