.h文件中有什么?
(1)#define
(2)typedef
(3)函数声明
(4)extern变量
C++标准并没有规定头文件中不能定义变量,只不过如果在头文件中定义变量,而该头文件被多次包含的话,会造成变量重定义问题(定义和声明是不同的,一个程序中对变量只能定义一次,声明可以多次)。
也就是说头文件中不能放定义,但是有三个例外:(1)static int x=20;(2)类的定义;(3)inline函数
关于extern:
(1)在头文件中使用extern应该是这样的:extern int x;这是声明全局变量x,代表在其它任何引用此文件的地方对其进行int x=10赋值。而不能是这样的:extern int x=10; 如果在头文件中有这样的语句:int x;放在头文件中,表示全局变量声明。静态全局变量、全局变量默认初值都是0.
(2)只有全局的、没有被static修饰的变量才能声明为extern的,因为static修饰过的变量只能在当前源文件内使用,这和extern相悖。
(3)const的全局变量,只能在被它定义的文件中被访问,如果想被其它文件访问,需要加上extern关键字。而非const变量默认为extern的。
(4)extern出现在源文件中,可置于变量或者函数前,以表示变量或者函数的定义在别的文件中。提示编译器遇到此变量或函数时,在其它模块中寻找其定义
(5)C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。
(6)普通全局变量定义不能出现在头文件中,如int x=10;但是static int x=10;可以出现在头文件中,而且如果多个源文件都包含了这个头文件,则x在各个源文件中有一份单独初值相同的拷贝,如果某一个源文件对其修改了,不会影响其他源文件中的该值。