0

そのため、アプリケーションのアーキテクチャをよりモジュール化された設計にアップグレードする作業を行っています。特定のターゲット向けにビルドする場合は、基になるモノリシック c ライブラリを使用する C++ アプリケーションです。それ以外の場合は、別のライブラリ バックエンドを使用します。

現在、アプリケーションのフロントエンド コードである GUI コードは、1 つのターゲットでのみ機能するモノリシックな c ライブラリに直接結び付けられています。何が行われたかというと、モノリシックな c-library が「モジュール」に入れられ、アプリケーションの GUI 部分が消費する共通の C++ インターフェイスを公開します。この方法でビルド ターゲットを変更でき、GUI コードは変更されません。既存の GUI コードは、考えられるすべての C ライブラリに共通する C ライブラリ内で定義された構造を使用します。

C++ モジュール内で、次のような種類のプロキシ タイプを定義しました。

//ModuleTypes.hpp
typedef CPP_TYPE C_LEGACY_TYPE;

また、GUI コードは、既存の C_LEGACY_TYPE の代わりに CPP_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 内に "C_LEGACY_TYPE.hpp" を #include することです。ただし、これにより、コンパイル時にレガシー C ヘッダーがどこにあるかを GUI が認識しなければならなくなります。

GUI.hpp に "ModuleTypes.hpp" を #include してもらいたいのですが、スタティック ライブラリの C_LEGACY_TYPE の定義を使用し、"ModuleTypes.hpp" 内に "C_LEGACY_TYPES.h" を #include する必要はありません。

エラーが発生する理由を理解しています。別の解決策を探しています。GUI モジュールをコンパイルするときにレガシー ヘッダーをインクルードせずに、GUI モジュールが ModuleTypes.hpp で定義されている型を使用できるようにするにはどうすればよいですか?

アーキテクチャの変更に伴い、C++11 を移行するので、どんな提案も受け付けています。VC2010 は、私たちが構築しているものです。

4

1 に答える 1

3

バックエンドの C ライブラリを共通のインターフェイス レイヤー (ラッパー クラス) の背後に分離することで正しいことを行っているため、後でバックエンドを別のものに簡単に置き換えることができます。

ただし、C ライブラリへのインターフェイスで使用される型がラッパー クラス内で同様に分離されていることも確認する必要があります。GUI レイヤーにはC_LEGACY_TYPE.hppヘッダー ファイルを含める必要があるため、型が分離されていないのではないかと思います。

これは、GUI が認識している型から C ライブラリで使用される型に変換するために、ラッパー クラス内で何らかの型変換を行う必要があることを意味する場合があります。ラッパー クラスのインターフェイス (つまり、共通インターフェイス) には、バックエンド C ライブラリに固有の型を含めてはなりません。

于 2012-07-12T02:36:35.613 に答える