typedef结构混乱中的指针

时间:2014-03-23 01:20:27

标签: c pointers struct typedef

我正在尝试定义一个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;

我很困惑编译器如何解析嵌套指向同一类型的指针的结构。很高兴有人帮我澄清这一点。

由于

2 个答案:

答案 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是邪恶的,你应该只使用BNODEBNODE *,但这是一个风格问题,而不是技术问题之一。

如果是我的代码,它可能更像是:

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是什么。