所以我正在努力将应用程序架构升级到更加模块化的设计。它是一个C ++应用程序,如果我们为特定目标构建,则使用底层单片c库,否则它使用不同的库后端。
目前,应用程序前端代码GUI代码直接与单片c-library绑定,后者仅适用于一个目标。已经完成的是将单片c库放入“模块”中,该模块为应用程序的GUI部分公开了一个通用的C ++接口。这样我们就可以改变构建目标,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就是我们正在构建的。
答案 0 :(得分:3)
通过将后端C库分隔在公共接口层(包装器类)后面,您正在做正确的事情,因此您可以在以后轻松地将后端替换为其他内容。
但是,您还需要确保在C ++接口中使用的类型在包装器类中是类似的隔离。由于您的GUI层需要包含C_LEGACY_TYPE.hpp
头文件,因此我怀疑您的类型不是应该隔离的。
这可能意味着您需要在包装器类中进行一些类型转换,以便从GUI知道的类型转换为C库使用的类型。包装类的接口(即公共接口)不得包含特定于后端C库的任何类型。