0

不透明な構造と前方宣言を使用してプロジェクトから依存関係を安全に削除しようとしていますが、ほとんどの場合と同様に、まだ列挙型にこだわっています。

ヘッダー ファイルから削除しようとしているヘッダー ファイルの依存関係には、列挙の値を設定する定数が定義されています。このようなもの

// depends header
#define DEP_TYPE_ONE   1
#define DEP_TYPE_TWO   2
#define DEP_TYPE_THREE 3

// My header
enum TYPES
{
    T_ONE     = DEP_TYPE_ONE,
    T_TWO     = DEP_TYPE_TWO,
    T_THREE   = DEP_TYPE_THREE
}

ヘッダーに依存ヘッダーを含める必要がないようにする方法を見つけようとしています。

おそらく答えは単純に「そんなことはできない」でしょうが、解決策があれば私の人生は無限に楽になるので、質問したいだけです。

4

4 に答える 4

1

依存ヘッダーのインクルードを削除し、値をハードコードして、依存関係をコメントするのはどうですか:

// my_header.h

// NOTE: Enumerands must be in sync with symbols defined in depends.h
enum TYPES
{
    T_ONE     = 1, // DEP_TYPE_ONE
    T_TWO     = 2, // DEP_TYPE_TWO
    T_THREE   = 3  // DEP_TYPE_THREE
};

値が同期しなくなるという懸念を和らげるために、1 つ以上のコンパイル時のアサートを含む別のヘッダーまたはソース ファイル (クラスまたは API のユーザーが取得しないもの) を用意できます。

// Some non-distributed file

#include <depends.h>
#include "my_header.h"

// Compile-time assertion macro
#define compile_time_assert(cond, msg) \
    typedef char msg[(cond) ? 1 : -1]

// Check assumptions at compile time...
compile_time_assert(T_ONE==DEP_TYPE_ONE, ValueOutOfSync1);
compile_time_assert(T_TWO==DEP_TYPE_TWO, ValueOutOfSync2);
    .
    .
    .

これにより、値が同期しなくなると、コンパイル時エラーが発生します。

compile_time_assert マクロの詳細については、http ://www.embedded.com/columns/programmingpointers/164900888?_requestid=379501 を参照してください。

于 2010-02-24T06:33:21.167 に答える
0

あなたは正しいです、あなたはできません。ここでは、コンパイラではなくプリプロセッサを扱っています(前方宣言の場合と同様)。

コンパイラが「強制インクルード」オプションをサポートしている場合は、「偽造」できる可能性がありますが、依存関係は残り、ビルドするファイルが必要です。

于 2010-02-24T05:40:00.620 に答える
0

それはあなたが望むものではありませんが、依存ヘッダーをヘッダーに含めない唯一の方法です:

enum TYPES 
{ 
    T_ONE     = 1, 
    T_TWO     = 2, 
    T_THREE   = 3 
} 
于 2010-02-24T05:21:39.090 に答える
0

完全な答えではありませんが、匿名の列挙型を検討しましたか? 多くの内部依存関係を持つヘッダーに多くの定数を定義したグラフ作成ライブラリを使用しているときに、一度同様の問題が発生しました。これはコンパイル時間に影響を与えていました。#define'sだから、ヘッダーの匿名名前空間の匿名列挙に全体をモックしました! 何かのようなもの :-

namespace {
  enum {
    DEP_TYPE_ONE = 1,
    DEP_TYPE_TWO,
    // ....
    DEP_TYPE_LAST
  };
}

このアプローチを使用すると、これらの名前付き定数を直接使用する多くのコードをリファクタリングする必要がなくなります。しかし、ヘッダーが新しい定数を定義するとすぐに列挙型を更新するのは、メンテナンスの悪夢です。

あなたの場合は試してみる価値があると思います。

HTH、

于 2010-02-24T05:23:20.807 に答える