1.在头文件中定义const类型的非static变量,在link时不会报错,这是因为const型的变量在complie时已经转换为常量,每个obj模块里有一个相同内容的常量,并不会有变量名冲突发生。
2.在头文件定义非const类型时,link时报错,这是因为这样相当于在每个包含该头文件的cc文件的全局域定义了一个名字相同的全局变量,虽然在complie时由于分开编译,不会产生错误,但是在link时,将会发生变量名冲突。
3.在头文件中使用extern 声明一个全局变量时可以的,而且是全局变量使用的推荐做法,前提是声明的这个全局变量,已经在一个cc文件,且只在一个cc文件中定义。
4. 在头文件中定义的一个static变量,对于包含该头文件的所有源文件,实质上在每个源文件内定义了一个同名的static变量,他们仅为该源文件的全局变量而非全程序的全局变量。实际上在编译过程中,会为其每个obj模块中编译产生不同的名字,所以在link时候不会报错。但这样相当于在每个obj模块中有一个的static变量,它实际上是独立在每个obj模块中的文件级全局变量,不是全程序域的全局变量。
所以,在头文件中,最好只声明而不定义,定义也仅仅定义const型变量