更清晰的DirectX程序结构(基于DirectInput实验)

更清晰的DirectX程序结构(基于DirectInput实验) 作者:蒋轶民

  这次我在DirectX程序的结构上作出了较大的调整。将原本一个整体的文件分成很多很多的小文件。我希望通过这样的分类,让自己变得更加易于管理这些程序代码。

 

  这次的主要调整是将一个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文件中定义这个变量就可以了。这真是一个好方法,既节省了编译时间,也避免了符号重定义的问题。 

由于没有带来源代码,所以下次再把自己的源代码上传给大家!

有时间的话,我会更加努力地开发DirectIput输入系统的!

你可能感兴趣的:(游戏,编程,dll,exe,编译器,linker)