将一个cpp文件分割成几个cpp文件,另外加上一个h文件。《C++游戏设计》这本书上了解到,cpp文件通常是要编译的,而且是带着h文件一起展开进行编译的。通常的h文件不能进行编译。所以我们只能在cpp文件上进行编译。但是这里问题就出现了。
如果一个大型项目,它要处理为数众多的文件,可能文件的包含关系有着数十层,h文件和cpp文件众多,那么项目组的如果修改了一个小小的h文件,就得使整个项目组等上数个小时的编译时间,这是多么令人烦恼的啊。而将一些关键的部分放入cpp文件就不同了。cpp文件会编译成obj文件,我们再将obj通过linker与lib文件连接在一起,就能够最终生成exe或者是dll文件了。
懂得了这一点后我们再来看看Visual C++。Visual C++ 在组织项目的时候能够检测用户对cpp和h文件的修改。如果cpp或h文件没有检测到修改,那么它就不会进行改动。特别是cpp文件。更是不会重新编译成obj文件。这样就会缩短整个编译时间。有时的效果是不使用这种方式的数倍。
那么在处理变量的时候又是怎样做呢?我们看到,在项目里通常有着一些全局变量。有些甚至是不可避免的。在游戏编程中的全局变量特别多。这样的话,在处理变量之间的可见性就是摆在我们面前的一个问题了。使用以前的h文件嵌套的方式似乎不用担心,但这真的就没有任何问题了吗?
如果在一个h文件中定义了一个全局变量a,这个h文件被多个cpp引用。也就是多个cpp包含了这个h文件。这样的话,我们在编译的时候就会出现linker错误。主要是多个obj文件都定义了这个符号,为了保持唯一性,连接器不允许重新定义符号。我们失败了。
那么还有什么办法可以解决问题呢?对了,使用extern关键字。extern关键字正是为上述问题准备的。使用extern关键字,可以让编译器先忽略这个定义的合法性。因为在连接的时候它会在其余的obj文件中寻找这个符号。所以在编译的时候编译器会忽略我们定义全局变量的合法性。这时我们只需要在同一项目其它的cpp文件中定义这个变量就可以了。这真是一个好方法,既节省了编译时间,也避免了符号重定义的问题。