C递归typedef结构

1 c

#include <stdio.h>
#include <stdlib.h>

#define MAX_ELEMENT 100

typedef struct TreeNode{
    int weight;
    TreeNode *left_child;
    TreeNode *right_child;
} TreeNode;

typedef struct element{
    TreeNode *ptree;
    int key;
} element;

typedef struct HeapType{
    element heap[MAX_ELEMENT];
    int heap_size;
} HeapType;
Run Code Online (Sandbox Code Playgroud)

我得到了错误:

error: unknown type name ‘TreeNode’
     TreeNode *left_child;
error: unknown type name ‘TreeNode’
     TreeNode *right_child;
Run Code Online (Sandbox Code Playgroud)

我不明白为什么……你能解释一下吗?

Jon*_*ler 5

使用您的代码:

typedef struct TreeNode{
    int weight;
    TreeNode *left_child;
    TreeNode *right_child;
} TreeNode;
Run Code Online (Sandbox Code Playgroud)

在解析TreeNode该行之前,该名称是未知的} TreeNode;。在处理该行时TreeNode *left_child;,编译器知道有一个类型struct TreeNode,但它对类型一无所知TreeNode

您还可以使用:

typedef struct TreeNode Treenode;

struct TreeNode
{
    int weight;
    TreeNode *left_child;
    TreeNode *right_child;
};
Run Code Online (Sandbox Code Playgroud)

第一行说“有一个结构类型struct TreeNode,并且TreeNode是该类型的别名”。其余的代码行定义了struct TreeNode.

或者,正如其他答案指出的那样,您可以使用:

typedef struct TreeNode
{
    int weight;
    struct TreeNode *left_child;
    struct TreeNode *right_child;
} TreeNode;
Run Code Online (Sandbox Code Playgroud)

编译器对类型struct TreeNode有足够的了解,以便在读取定义时能够处理指向该类型的指针。注释 C11 §6.7.2.1 结构和联合说明符 ¶3

结构或联合不应包含不完整或函数类型的成员(因此,结构不应包含自身的实例,但可以包含指向自身实例的指针),...