为变量分配地址和存储空间的称为定义,不分配地址的称为声明。
变量定义:用于为变量分配存储空间,还可为变量指定初始值,程序中,变量有且仅有一个定义。
变量声明:用于向程序表明变量的类型和名字。
定义也是声明:当定义变量时我们声明了它的类型和名字。
extern声明不是定义,因为不分配存储空间。extern告诉编译器,变量在其他地方定义了。
//声明一个外部变量:(通过使用extern关键字,可以声明变量名而不定义它) extern int Number;
//定义一个变量 int Number;
如果声明有初始化式,就被当作定义,即使前面加了extern。
只有当extern声明位于函数外部时,才可以被初始化。
//是extern声明,也是定义,因为对变量进行了初始化 extern double pi=3.1416;
一个变量可以在多个地方声明,但是只能在一个地方定义。
加入extern修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。
说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间,如外部变量。
变量的声明有两种情况:
1、一种是需要建立存储空间的。例如:int Number 在声明的时候就已经建立了存储空间。
2、一种是不需要建立存储空间的。 例如:extern int Number 其中变量Number是在别的文件中定义的。
前者是“定义性声明(defining declaration)”或者称为“定义(definition)”,而后者是“引用性声明(referncing declaration)”。
从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所有的声明都是定义,例如:int Number 它既是声明,同时又是定义。然而对于 extern int Number 来讲它只是声明不是定义。
一般的情况下我们常常这样叙述:建立存储空间的声明称之为“定义”,不需要建立存储空间的声明称之为“声明”。
很明显我们在这里指的声明是范围比较窄的,即狭义上的声明,也就是说非定义性质的声明。
函数的声明和定义的区别比较简单,只是看函数之后是否带有{ }即可;
带有{ }的就是定义,不带的就是声明;
注意事项:
1.变量定义不要放在.h文件中,这会导致重复定义的错误;
2.可以在头文件中声明一个变量,在用的时候包含这个头文件就声明了这个变量;
总结:
1.变量在使用之前要被定义或者声明;
2.变量只能被定义一次,但是可以被声明很多次;
3.定义会分配相应的存储空间,但是声明不会;
注意:
有三个例外,以下三种实体的定义也可以放到头文件中:
1.值在编译时就已知的const变量的定义可以放到头文件中;
2.类的定义可以放到头文件中;
3.inline函数;
这三个实体可以定义在多个源文件中,只要在每个源文件中的定义相同;