0

所以我正在努力将应用程序的架构升级为更加模块化的设计。这是一个 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 是我们正在构建的。

4

1 回答 1

3

通过将后端 C 库分离在一个公共接口层(包装类)后面,您正在做正确的事情,因此您可以在以后轻松地用其他东西替换后端。

但是,您还需要确保 C 库接口中使用的类型在包装类中同样隔离。由于您的 GUI 层需要包含C_LEGACY_TYPE.hpp头文件,我怀疑您的类型没有像应有的那样被隔离。

这可能意味着您需要在包装类中进行一些类型转换,以将 GUI 知道的类型转换为 C 库使用的类型。包装类的接口(即公共接口)不得包含任何特定于后端 C 库的类型。

于 2012-07-12T02:36:35.613 回答