先说结果
变量(函数)只能被定义一次,但是可以被多次声明。想要在多个文件中使用同一个变量(函数),就必须将声明和定义分离开来,变量(函数)的定义只能出现在一个文件中,而声明却可以出现在多个头文件中。
记得当初初学C的时候,总想一个工程分为多个.c文件,却因为变量传递问题焦头烂额。而这里就使用到了separate compilation机制。但是将程序分成了多个文件后,就必须有文件间的共享代码。
为了完成分离式编译,在C/C++里有声明和定义两个东西。
定义:创建一个与名字相关联的实体,并且申请存储空间(也可以为变量赋值)。
声明:为了让程序知道这个名字,如果想使用一个定义在其他位置的名字,就必须事先声明。
对于变量来说:
int num = 0; // 声明并定义一个整型变量num,并且赋予初值0.
因为包含了显式初始化的声明就是定义了。当然这个num仅仅在它的定义文件里面才可以直接使用。
如果我想在其他文件使用,就必须声明。
extern int num; // 声明变量num,并不是定义
但是如果我们按照下面这样写会怎样?
extern int num = 0;
如果你在程序中这样使用了就会发现会报错,原因是变量重复定义。这是因为如果给extern关键字所标记的变量一个初始值,这时候就不是声明了,会抵消extern的作用,变成定义这个变量并且初始化。
extern int num = 0; // 定义num并初始化为0
同样,对于函数来说也是一样,不过在头文件里的函数的声明时可以省略extern关键字的(变量的声明不能省略extern)。