1

次のスキームを想定します。

/* avl.c */

typedef struct avl {
    void *data;
    int height;
    struct avl *left, *right;
} node;

/* avl.h */

struct avl; /* opaque */

使いたい:

struct node *root;

それ以外の

node *root;

avl.cで、しかし今のところ私が見つけた最高のものは次のとおりです。

struct avl {
    void *data;
    int height;
    struct avl *left, *right;
};

#define node avl

別の方法?

4

4 に答える 4

3

次に、次を削除する必要がありますtypedef

struct node{
    void *data;
    int height;
    struct node *left, *right;
} 
于 2013-06-04T11:06:58.260 に答える
3

これを行うには、マクロを使用する以外に方法はありません。その理由は、構造体タグには独自の名前空間があるためです。構造体に同じメンバー型が含まれていても、タグ名前空間内の異なる名前は常に異なる型を参照します。型の適切なエイリアシングは、別の型ではなく別名として定義されている typedef でのみ行うことができます。

于 2013-06-04T11:16:52.353 に答える
1
struct avl {
    void *data;
    int height;
    struct avl *left, *right;
};

typedef struct alv node;

struct avl* ptr1; //valid
avl* ptr1; //not valid
struct node* ptr2;  //valid
node* ptr3;  //also valid

を使用する必要がありますがstruct avl、使用する必要はありませんstruct nodeが、必要に応じて使用できます。

于 2013-06-04T11:13:37.773 に答える