【C++】一套代码在不同项目中include同名不同文件时的(不良)解决办法

从java转到C++,不得不自己处理各种头文件包含问题。以前完全没有过这方面的经验,摸石头过河中

事情的背景是这样的:我有一套游戏代码,现在想给它做一个编辑器,希望尽可能重用以前的代码,不要一样的功能复制到两个项目里,以防止一个功能这边修改了那边没修改。

嗯,因为我的设计能力有限,导致要修改很多出才能重用原有代码。这已经不能叫完全的“重用”了吧……嘛,不真正重用这么一次,我永远也不会知道哪里应该设计的更灵活的,算是个好教训吧,好教训。

所谓复用,其实也只是新建一个项目,把原来游戏的源文件都导入进来,然后改一改。

在写编辑器的时候,我发现我需要修改引擎文件engine.h,我不希望这个修改应用于游戏本身,所以我从编辑器项目中移除了游戏的engine.h和engine.cpp文件,然后在编辑器项目目录下新建了两个同名文件导入了项目,在这两个新文件里做我的修改。

一开始我挺紧张的,感觉这么做很不靠谱,这肯定不是正确的复用之道(显然不是)。但是事实上它正确运转了,我也就没再多想。直到刚才,我发现我在engine里新写的函数IDE的自动补全里不给显示,硬写上去就是编译出错。到这里,我第一个想到的就是engine头文件导入错了。事实证明也确实如此。

我想,文件导入的头文件应该是和这个文件在同一个真实目录中的同名文件吧。比如engine.h文件在我的编辑器目录和原来的游戏目录里都有。我先导入了一个原来游戏目录里的头文件比如XXXWidget.h,因为这个头文件里include了engine.h,这个engine.h就是和这个XXXWidget.h在同一目录下的engine.h。哪怕我项目里有一个同名同姓的engine.h,include也是只看相对目录,不看项目配置。

那怎么办呢。

这个问题是我在编辑器目录里写新文件时遇到的,所以我在这个新文件的一排include命令的最后又手动include了一下engine.h(原本是靠前面include的原来游戏项目中的头文件间接include engine.h文件的),无效。我又把include engine.h的命令挪到了间接引入engine.h文件的头文件引用前面,行了。

经典的霰弹枪编程方法= =,再加上以前马博士指出的我的源代码注释陷阱,变量命名方式,看来我还是集各种恶劣的编程习惯于一身了

这时我才突然想起来,engine.h里面有

#ifndef__ENGINE_H__

#define__ENGINE_H__

这两句。所以只有最先被导入的engine才有效。嗯,懂了。可是再一想,那是不是我的项目里有的engine用的是原来的,有的用的是新的啊?这样,会不会有问题?还是一个类只有第一次导入的才有效?我行说ifndef命令啊define命令什么的都是只作用在一个源文件上的,在另一个源文件里就从新算了?嗯,好像接触到了一个比较深的C++问题了呢。一直被java照顾着,完全没考虑过这方面的事情,以后努力补上吧。这次我要优先做完编辑器,遇到的问题先搁置不理它!

#ifndef __ENGINE_H__

Comments

  1. 那是不是我的项目里有的engine用的是原来的,有的用的是新的啊?是的
    还是一个类只有第一次导入的才有效?应该是每一个源文件文件的第一次导入才有效
    为啥要修改engine.cpp呢,继承一下类然后把相关函数重写应该会更好吧

    1. 哈哈,我当时实在是菜的抠脚,大概连编译链接这个过程都还没理解清楚吧。
      现在回看这篇文章,我甚至不能理解我当时遇到的到底是什么困难。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注