规则1:不要在.h文件中定义变量(事实上这个变量一定义肯定是全局变量)
原因概要:因为.h文件的只包含一次声明不能保证该.h文件在整个项目中被只编译一次!!!,尽管能保证在一个CPP文件中能只被编译一次.如果能保证,在.h中声明变量也就可以了.这是为什么没人这样做的原因.
即:在CPP中用到的全局变量,不能在对应的.h里面定义,否则很可能会引重定义的错误!(出现error Link2005:XXX已在YYY.obj在定义)
原因分析:.h文件头部的只包含一次声明指一个CPP文件包含一个特定的.h时只能包含其一次,也就是能保证,在该CPP中其只被编译一次!这很正常,包含一次就是为了只编译一次,但是:一个.h文件在一个项目中可能被别的CPP文件也用到了.尽管别的CPP也是只包含了该.h文件一次,也只编译了一次,但对整个工程开说,这个.h文件却被编译了多次.
#if !define AAA_H
#define AAA_H
.......
#endif
规则2:尽量不使用extern.如果想用,就在全局变量所在的CPP对应的.H中声明extern,然后在需要用的地方引用.H文件即可,实现了extern的隐藏!
原因概要:因为.h文件的只包含一次声明不能保证该.h文件在整个项目中被只编译一次!!!,尽管能保证在一个CPP文件中能只被编译一次.如果能保证,在.h中声明变量也就可以了.这是为什么没人这样做的原因.
即:在CPP中用到的全局变量,不能在对应的.h里面定义,否则很可能会引重定义的错误!(出现error Link2005:XXX已在YYY.obj在定义)
原因分析:.h文件头部的只包含一次声明指一个CPP文件包含一个特定的.h时只能包含其一次,也就是能保证,在该CPP中其只被编译一次!这很正常,包含一次就是为了只编译一次,但是:一个.h文件在一个项目中可能被别的CPP文件也用到了.尽管别的CPP也是只包含了该.h文件一次,也只编译了一次,但对整个工程开说,这个.h文件却被编译了多次.
#if !define AAA_H
#define AAA_H
.......
#endif
规则2:尽量不使用extern.如果想用,就在全局变量所在的CPP对应的.H中声明extern,然后在需要用的地方引用.H文件即可,实现了extern的隐藏!