7

私はいくつかの一般的な構造を書き込もうとしています。基本的に、私の目的に必要なのはC ++テンプレートですが、Cで書いているので、テンプレートは考慮されていません。現在、私は自分が望むことを達成するための2つの方法を検討しています。

方法1:プリプロセッサを使用します。そのようです:

#define DEFINE_PAIR(T) typedef struct Pair_##T{ \
                           T x; \
                           T y; \
                        } Pair_##T

DEFINE_PAIR(int);

int main(){
   Pair_int p;
   return 0;
}

明らかな欠点は、型を使用する前にマクロを呼び出さなければならないことです。おそらくもっと不利な点がありますが、それを指摘していただきたいと思います。

方法2:次のようにvoidポインタを使用します。

typedef struct Pair{
   void* x;
   void* y;
} Pair;

明らかに、このアプローチは型安全ではありません(doubleのペアを期待する関数に文字列のペアを簡単に渡すことができます)。さらに、このアプローチでは、割り当て解除を行うコードが非常に面倒になります。

これについてのあなたの考えを聞きたいです。2つの方法のどちらが良い/悪いのか、そしてその理由は何ですか?Cで一般的な構造体を書くために使用できる他の方法はありますか?

ありがとう。

4

3 に答える 3

4

プリミティブデータ型のみを使用することを計画している場合は、元のマクロベースのソリューションで十分に気の利いたようです。ただし、以下のような関数間でポインターを渡すことによって使用されることを意図した、下に複雑な構造を持つ不透明(OPAQUE)データ型へのポインターのペアの格納を開始する場合。

complex_structure_type *object = complex_structure_type_init();
complex_structure_type_set_title(object, "Whatever");
complex_structure_type_free(object);

その後、あなたはする必要があります

typedef complex_structure_type *complex_structure_type_ptr; 

そうするには

DEFINE_PAIR(complex_structure_type_ptr);

だからあなたはできる

Pair_complex_structure_type_ptr p;

その後

p.x = object;

しかし、それはほんの少しの作業ですので、それがあなたのために働くと感じたら、それのために行ってください。コードを調べ、Pair_whateverのようなものを引き出し、CプリプロセッサにDEFINE_PAIR(whatever)を追加する独自のプリプロセッサをまとめることもできます。とにかく、あなたがここに提示したのは間違いなく素晴らしいアイデアです。

個人的には、voidポインターを使用するだけで、強力な型安全性を忘れてしまいます。Cには他の言語と同じタイプの安全機械がないため、何かを忘れる機会が増えるほど、誤って作成するバグが増えます。

幸運を!

于 2011-08-15T19:20:10.940 に答える
2

c ++のテンプレートはコードを記述するための言語を提供することに注意してください。単純に、cプリプロセッサよりも強力なツールを使用してコード生成を行うことを検討してください。

これで、ビルドに別のステップが追加され、ビルドが別の料金に依存するようになります(c ...で独自のジェネレーターを作成する必要がない限り)が、必要な柔軟性と型安全性が提供される場合があります。

于 2011-08-15T20:27:26.297 に答える
1

これはほとんど同じですが、もう少し機敏です。

#define PAIR_T(TYPE) \
    struct { \
        TYPE x; \
        TYPE y; \
    }


typedef PAIR_T(int) int_pair;
typedef PAIR_T(const char *) string_pair;

int main(void)
{
    int_pair p = {1, 1};
    string_pair sp = {"a", "b"};
}
于 2014-05-20T05:34:17.267 に答える