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

在不使用预处理器的情况下,您必须为 struct 和 typedef 赋予相同的名称才能使其工作,例如

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

所以现在struct nodenode是一回事。

于 2013-06-04T11:09:17.877 回答
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 回答