在不阻止关键字struct的情况下typedef结构

时间:2013-06-04 11:04:48

标签: c struct typedef

假设这个方案:

/* 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 个答案:

答案 0 :(得分:3)

然后你应该删除typedef

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

答案 1 :(得分:3)

在不使用预处理器的情况下,您必须为struct和typedef指定相同的名称,例如。

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

所以现在struct nodenode是一回事。

答案 2 :(得分:3)

除了使用宏之外别无他法。原因是struct标签有自己的名称空间。标记名称空间中的不同名称始终引用不同的类型,即使结构包含相同的成员类型。只能使用typedef来完成类型的正确别名,这些定义是别名而不是单独的类型。

答案 3 :(得分: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,但如果您愿意,可以使用{{1}}。