结构在c中没有字段错误消息

Struct doesn't have a field error message in c

我正在尝试编写一个二叉搜索树,但是我的 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;
}

可能是什么导致了这个问题?

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

这不是编译错误,而是静态分析器的限制。在代码片段中,node_ptr 的定义为 struct TreeNode*struct TreeNode 的定义之前。因此,当编译器看到该声明时,它所知道的只是 TreeNode 是某种 struct,甚至不一定在同一个翻译单元中定义。当它紧接着看到 struct TreeNode 的定义时,它无法将其与 node_ptr 的定义统一为 struct TreeNode*。因此,它不知道 struct TreeNodenode_ptr 成员指向什么,即使它指向另一个 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;

也可以 从技术上讲,#define NODE_PTR struct TreeNode* 如果把它写出来对你来说太丑陋了代码,但对我来说那更像是代码的味道。除非开发人员添加对像您这样的正确代码的支持,或者有更好的解决方法,否则 trade-off 您想要做什么完全取决于您。