声明或定义?

时间:2018-04-10 05:14:00

标签: c variables memory declaration extern

我无法理解extern的使用以及声明与定义的主题。我不明白为什么

extern int i;

是声明(无内存分配),而

int i;

是一个定义(分配内存)。

两个语句都不是仅将变量i声明为int,只有那个指定它是全局变量吗?

1 个答案:

答案 0 :(得分:0)

首先让我们澄清声明和定义之间的区别:

变量/函数的声明只是声明变量/函数存在于程序中的某处但是没有为它们分配内存。但变量/函数的声明起着重要作用。这就是变量/函数的类型。因此,当声明变量时,程序知道该变量的数据类型。在函数声明的情况下,程序知道该函数的参数是什么,它们的数据类型,参数的顺序和函数的返回类型。

来定义,当我们定义一个变量/函数时,除了声明的作用外,它还为该变量/函数分配内存。因此,我们可以将定义视为一套超级的声明。 (或声明作为定义的子集)。

从这个解释中可以明显看出,变量/函数可以被声明任意次,但只能定义一次。 (请记住,您不能拥有相同变量/功能的两个位置的基本原则。)

由于声明可以进行任意次,并且定义只能进行一次,我们可以注意到函数/变量的声明可以多次添加到多个C / H文件或单个C / H文件中。但是我们只注意到函数/变量的实际定义一次(即仅在一个文件中)。并且当extern将可见性扩展到整个程序时,只要知道函数的声明,就可以在整个程序的任何文件中的任何地方使用(调用)函数/变量。 (通过知道函数的声明,C编译器知道函数/变量的定义存在,并且它继续编译程序)。

对于int a;,它取决于它在源代码中的位置:

  • 在一个函数中,int a;是一个定义 - 它要求创建一个具有自动存储持续时间的int变量(当然是 也是宣言);

  • 在文件范围内,答案在C和C ++中有所不同。在C中,int a;是一个持久性的定义(只要类型和链接是可以接受的,就可以有多个定义);在C ++中,它是一个具有外部链接的普通定义。

  • 在结构或联合说明符中,int a;是会员的声明。