C头文件循环

我有几个头文件,它归结为:

tree.h中:

#include "element.h"

typedef struct tree_
{
    struct *tree_ first_child;
    struct *tree_ next_sibling;
    int tag;
    element *obj;
    ....
} tree;

和element.h:

#include "tree.h"

typedef struct element_
{
    tree *tree_parent;
    char *name;
    ...
} element;

问题是它们都相互引用,所以需要包含tree需要的元素,要包含元素需要的树.

这不起作用,因为定义“树”结构,元素结构必须是已知的,但是要定义元素结构,必须知道树结构.

如何解决这些类型的循环(我认为这可能与’forward declaration’有关系?)?

解决方法

我认为这里的问题不在于失踪的包围守卫,而是两个结构在他们的定义中需要彼此的事实.所以这是一个类型定义汉和蛋问题.

在C或C中解决这些问题的方法是对类型进行远程声明.如果您告诉编译器该元素是某种结构,那么编译器就可以生成一个指向它的指针.

例如.

里面树

// tell the compiler that element is a structure typedef:
typedef struct element_ element;

typedef struct tree_ tree;
struct tree_
{
    tree *first_child;
    tree *next_sibling;
    int tag;

    // Now you can declare pointers to the structure.
    element *obj;
};

这样你就不必在tree.h里面加入element.h了.

你也应该把包围守卫放在你的头文件.

相关文章

对象的传值与返回说起函数,就不免要谈谈函数的参数和返回值...
从实现装饰者模式中思考C++指针和引用的选择最近在看...
关于vtordisp知多少?我相信不少人看到这篇文章,多半是来自...
那些陌生的C++关键字学过程序语言的人相信对关键字并...
命令行下的树形打印最近在处理代码分析问题时,需要将代码的...
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特...