2013-06-04 25 views
1

假设这个方案:的typedef不妨碍关键字struct一个struct

/* 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

你试图解决什么(更高水平)的问题? – pmg

回答

3

除了使用宏来做到这一点,没有别的办法。原因是struct标签有自己的名称空间。即使结构包含相同的成员类型,标记名称空间中的不同名称也始终指向不同的类型。类型的正确别名只能通过typedefs完成,这些类型定义是定义的是别名而不是单独的类型。

3

那么你应该删除typedef

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

谢谢,但我想在avl.c中将指定为结构节点,并且在项目的其余部分中将指向 –

+0

我不明白为什么要使用具有两个不同名称的结构类型,但是您的' #define'会做到这一点。 – gkovacs90

3

不使用预处理,你必须给结构和类型定义相同的名称为工作,例如

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

所以现在struct nodenode是同样的事情。

+0

对,但现在我想要一个名为'struct avl'(不简单地称为'avl')的不透明结构作为别名 –

+0

@DavidRF这意味着您需要执行一些预处理器模糊处理。 – nos

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,但你可以的,如果你想。

+0

谢谢@zakinster,但似乎不能在avl.c之外使用不透明结构 –