为了允许把程序拆分成多个逻辑部分来编写,C++语言支持单独编译(separate compilation)机制,该机制允许将程序分割为若干个文件,每个文件可被独立分离式编译。
为了支持分离式编译,C++语言将声明和定义区分开来。
变量的声明有两种情况: 一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。 另一种是不需要建立存储空间的。
声明是告诉编译器一些信息,以协助编译器进行语法分析,避免编译器报错。而定义是告诉编译器生成一些代码,并且这些代码将由连接器使用。即:声明是给编译器用的,定义是给连接器用的。
概念:
1,声明(declaration)
用于向程序表明变量的类型和名字,它只是说明变量定义在程序的其他地方,在其他地方已经完成了定义,这里只是说明有这么个变量存在。
2,定义(definition)
告诉编译器建立变量并分配存储空间,并且给变量一个指定的初始值。
总结:
1,定义也是声明,当定义变量时我们声明了它的类型和名字,同时为变量分配了内存空间及初始值。
2,如果想声明一个变量而非定义它,就在变量名前添加关键字extern,通过extern关键字声明变量而不是定义,即不分配存储空间。
3,extern声明的变量不要显式地初始化变量,任何包含显示初始化的声明就会变成定义。我们能给由extern关键字标记的变量赋一个初始值,但是这么做也就抵消了extern的作用。extern语句如果包含初始值就不再是声明,而变成定义了:
extern double pi = 3.1416; //definition
4,在函数体内部,如果试图初始化一个由extern关键字标记的变量,将引发错误。
5,变量能且只能被定义一次,但是可以被多次声明。
6,如果要在多个文件中使用同一个变量,就必须将声明和定义分离。此时,变量的定义必须出现在且只能出现在一个文件中,而其他用到该变量的文件必须对其进行声明,却绝对不能重复定义。
7,在头文件中不能放变量的定义,一般存放变量的声明。因为头文件要被其他文件包含,如果放到头文件当中就不能避免变量被多次定义。
变量的声明如:extern int i; 在变量定义前加extern关键字表示声明一个变量但不定义它,这对函数同样有效,如:extern int Add(int a, int b);因为没有函数体,编译器必会把它视作声明而不是定义,extern关键字对于函数来说是多余的,可选的。
变量的定义如:int i;如果在此之前没有对i的声明,那么这里既是对它的声明也是对它的定义,编译器会为其分配对应的内存。
注:有三个例外,以下三种实体的定义也可放到头文件中。
1.值在编译时就已知的const 变量的定义可以放到头文件中
const int num = 10;
2,类的定义可以放到头文件中。
3,inline 函数。
感谢原作者的辛勤劳作:
https://www.cnblogs.com/vineleven/p/4650750.html
http://lizhiyuan.bokee.com/907634.html
https://blog.csdn.net/m0_37962600/article/details/78334077
https://www.cnblogs.com/lca1826/p/6505701.html