struct在c中没有字段错误消息

时间:2018-03-09 17:02:22

标签: c struct typedef clion

我正在尝试编写二叉搜索树,但是我的Clion IDE在不同的地方给了我这个错误:Struct TreeNode doesn't have a field 'balance'。 我选择'balance'作为例子,但这发生在结构中的每个字段。 我的整个头文件如下:

#define CARD_SIZE 15

typedef struct TreeNode *node_ptr;

typedef struct TreeNode{
    char card[CARD_SIZE];
    int balance;
    node_ptr left;
    node_ptr right;
    node_ptr parent;
}Node;

发生错误的示例是:

bool updateSearch(int balance, char *card) {
    node_ptr node = searchNode(card,tree.root);
    if(node){
        node->balance += balance; //Right here
        return true;
    }
    return false;
}

可能导致此问题的原因是什么?

1 个答案:

答案 0 :(得分:1)

根据评论,我们似乎已经诊断出问题,@ joneleam确认该解决方法有效。

这不是编译错误,而是静态分析器的限制。在代码段中,node_ptr的定义为struct TreeNode*,位于struct TreeNode的定义之前。因此,当编译器看到该声明时,它只知道TreeNode是某种struct,它甚至可能不必在同一个转换单元中定义。如果它确实立即看到struct TreeNode的定义,则无法将此node_ptr的定义统一为struct TreeNode*。因此,它不知道node_ptr的{​​{1}}成员指向哪个成员,即使它指向另一个struct TreeNode

解决方法是重构为:

TreeNode

也可以,技术上来说,#define CARD_SIZE 15 typedef struct TreeNode{ char card[CARD_SIZE]; int balance; struct TreeNode* left; struct TreeNode* right; struct TreeNode* parent; }Node; typedef struct TreeNode *node_ptr; ,如果把它写出来,对你来说代码太过分了,但这对我来说更像一个代码味道。除非开发人员添加对您的正确代码的支持,或者有更好的解决方法,否则由您做出的权衡取决于您。