1

私は一般的なリストadtを書いています、そしてこれは私がこれまでヘッダーに持っているものです。私が知っていることから、これは通常それが行われる方法です。

typedef struct _node {
    void *data;
    struct _node *next;
} Node;

typedef struct {
    Node *dummy;
    int (*comparePtr) (void *d1, void *d2);
    void (*destroyPtr) (void *data);
} List;

List *ListCreate (int (*comparePtr) (void *d1, void *d2), void (*destroyPtr) (void *data));
void ListDestroy (List *node);
void ListAddToTail (List *list, void *data);
int ListContains (List *list, void *data);
void *ListGetFromIndex (List *list, int index);

実装側では問題なく動作します。私が気付いたのは、このadtを使用して整数を格納するには、この方法で呼び出しを行う必要があるということです。

int a = 5;
ListAddToTail (list, &a);

一方、完璧な世界では、これを行うことができます

ListAddToTail (list, 55);

だから問題は、これを変更して、ポインターまたは非ポインター、主に整数や文字などのプリミティブ型である非ポインターの任意のタイプのデータを渡すことができるようにすることは可能ですか?

4

1 に答える 1

3

これを解決するためのクリーンで完全に優れた方法はありません。いくつかのオプションがあります。

  • ほとんどのプラットフォームでは、整数をに詰め込むだけで簡単に回避できますvoid *。面倒ですが、特に警告を消す場合はかなりうまく機能します

  • 必要なスペースを割り当ててポインタを返す独自のボクシング関数/マクロを定義します。typeofあなたはおそらくトリックを使って本当に素晴らしいマクロを作ることができます。しかし、あなたはそのスペースを解放することを忘れないでください

主な問題は均一性です。あなたのリストは人々がポインタを保存することを可能にします。「データへのポインタを取得するにはどうすればよいですか」などの質問に対処させる必要があります。


編集

プリミティブな「ボックス」マクロを作成しました。

#define box(value)                              \
({                                              \
    typeof(value) *ptr = malloc(sizeof *ptr);   \
    *ptr = value;                               \
    ptr;                                        \
})
于 2013-01-15T21:32:45.733 に答える