假设这个方案:
/* 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
另一种方式?
答案 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 node
和node
是一回事。
答案 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}}。