所以我正在努力将应用程序的架构升级为更加模块化的设计。这是一个 C++ 应用程序,如果我们正在为特定目标构建,它使用底层的整体 c 库,否则它使用不同的库后端。
目前,应用程序前端代码,即 GUI 代码,直接与单一的 c 库相关联,该库仅适用于一个目标。所做的是将整体 c 库放入一个“模块”中,该模块公开了一个通用 C++ 接口,供应用程序的 GUI 部分使用。这样我们就可以改变构建目标,而 GUI 代码不会改变。先前存在的 GUI 代码使用在 C 库中定义的结构,这些结构对所有可能的 C 库都是通用的。
在 C++ 模块中,我定义了如下所示的代理类型:
//ModuleTypes.hpp
typedef CPP_TYPE C_LEGACY_TYPE;
并且 GUI 代码只是使用 CPP_TYPE 代替先前存在的 C_LEGACY_TYPE。
在模块项目的其他地方,Module.hpp 看起来像:
//Module.hpp
#include "C_LEGACY_TYPES.hpp"
...
#include "ModuleTypes.hpp"
因此,当 C++ 模块编译为静态库时,Module.hpp 在 ModuleTypes.hpp 之前包含 C_LEGACY_TYPES.hpp(因此 ModuleTypes.hpp 知道 C_LEGACY_TYPE 是什么),并且静态库编译得很好。
问题出在 GUI 模块中,例如:
//Gui1.hpp
class Gui1 {
void Method1(CPP_TYPE value);
};
由于不能向前声明 CPP_TYPE,因此我在顶部添加了 #include "ModuleTypes.hpp" 到 Gui1.hpp。
//Gui1.hpp
#include "ModuleTypes.hpp"
class Gui1 {
void Method1(CPP_TYPE value);
};
当我去编译 GUI 模块时,它会出错,因为它无法弄清楚 C_LEGACY_TYPE 是什么。解决此问题的唯一方法是在 ModuleTypes.hpp 中 #include "C_LEGACY_TYPE.hpp"。然而,这导致 GUI 在编译时必须知道遗留 C 头文件在哪里。
我希望 GUI.hpp #include "ModuleTypes.hpp" 但使用静态库中 C_LEGACY_TYPE 的定义,而不必在 "ModuleTypes.hpp" 中 #include "C_LEGACY_TYPES.h"。
我了解错误发生的原因,我正在寻找替代解决方案。如何让 GUI 模块能够使用 ModuleTypes.hpp 中定义的类型,而不必在编译 GUI 模块时包含旧头文件?
随着架构的变化,我们正在迁移 C++11,所以我愿意接受任何建议。VC2010 是我们正在构建的。