我正在尝试定义一个typedef结构,如下所示:
typedef struct node{
int keys[2*MIN_DEGREE-1];
struct node* child[2*MIN_DEGREE];
int numkeys;
int isleaf;
} BNODE,*BNODEPTR;
而不是使用struct node* child[2*MIN_DEGREE]
为什么我不能按如下方式声明结构:
typedef struct node{
int keys[2*MIN_DEGREE-1];
BNODEPTR child[2*MIN_DEGREE];
int numkeys;
int isleaf;
} BNODE,*BNODEPTR;
我很困惑编译器如何解析嵌套指向同一类型的指针的结构。很高兴有人帮我澄清这一点。
由于
答案 0 :(得分:4)
你不能在结构的主体中使用BNODEPTR
,因为它要么根本不作为一个类型存在,直到结构体的闭括号之后的定义之后,或者(更糟)它指的是一种不同的类型 * 。
您可以使用:
typedef struct node BNODE, *BNODEPTR;
struct node
{
int keys[2*MIN_DEGREE-1];
BNODEPTR child[2*MIN_DEGREE];
int numkeys;
int isleaf;
};
又有一个完整的论点说BNODEPTR
是邪恶的,你应该只使用BNODE
和BNODE *
,但这是一个风格问题,而不是技术问题之一。
如果是我的代码,它可能更像是:
typedef struct Node Node;
struct Node
{
int keys[2*MIN_DEGREE-1];
Node *child[2*MIN_DEGREE];
int numkeys;
int isleaf;
};
在C ++中,规则略有不同,您不需要typedef
行(因此Node
将被称为开括号中的类型。)
*只有在外部作用域中定义原始BNODEPTR
并且这个出现在函数内部时才会发生这种情况,但是当它发生时,它确实令人困惑!
答案 1 :(得分:1)
而不是使用
struct node* child[2*MIN_DEGREE]
为什么我不能宣布 结构如下:BNODEPTR child[2*MIN_DEGREE];
?
此时,编译器(尚未)知道符号BNODEPTR
是什么。