gpt4 book ai didi

c++静态库依赖,header包括header

转载 作者:太空宇宙 更新时间:2023-11-04 07:33:13 25 4
gpt4 key购买 nike

所以我正在努力将应用程序的架构升级为更加模块化的设计。它是一个 C++ 应用程序,如果我们为特定目标构建它,它会使用底层单体 C 库,否则它会使用不同的库后端。

目前,应用程序前端代码,即 GUI 代码,直接绑定(bind)到单一的 c 库,它只能在一个目标上运行。已经完成的是将单体 C 库放入一个“模块”中,该模块公开了一个公共(public) C++ 接口(interface)供应用程序的 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 header 的位置。

我了解错误发生的原因,我正在寻找替代解决方案。如何让 GUI 模块能够使用 ModuleTypes.hpp 中定义的类型,而无需在编译 GUI 模块时包含旧版 header ?

随着架构的改变,我们正在迁移 C++11,所以我愿意接受任何建议。我们正在使用 VC2010 进行构建。

最佳答案

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

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

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

关于c++静态库依赖,header包括header,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11444250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com