双递归结构

double-recursive structs

本文关键字:结构 递归      更新时间:2023-10-16

我对如何创建两个相互引用的结构感到困惑。我找不到像以前问过的任何问题。
所以,我知道这将编译得很好:

    struct MyStruct {
        MyStruct* p;
    };

但是,例如,

    struct A {
        B* pBstruct;
    };
    struct B {
        A* pAstruct;
    };

这不会编译。

你需要一个前向声明来使类型已知:

struct B;
struct A {
    B* pBstruct;
};
struct B {
    A* pAstruct;
};

所以,我知道我问了这个问题,但我想通了,并认为回答这个问题可能会对其他人有所帮助。

就像制作递归函数一样,结构也必须进行原型设计。
因此,请考虑制作递归函数:

    int fnc_a();
    int fnc_b();
    int fnc_a()
    {
        fnc_b();
    }
    int fnc_b()
    {
        fnc_a();
    }

前两行标识为函数的原型,以便在提供其实际定义/声明之前可以使用它们。
现在考虑再次创建两个递归结构:

    struct A;
    struct B;
    struct A {
        B* pBstruct;
    };
    struct B {
        A* pAstruct;
    };

前两行声明了这两个结构的存在,以便在声明它们之前可以使用它们。(不要费心评论我只需要 B 结构原型的事实 - 我确实认识到这一点)

最后一点,不要忘记使用结构"指针"变量而不是结构变量。这不会编译,因为它会创建一个无限大的结构:

    struct A;
    struct B;
    struct A {
        B pBstruct;
    };
    struct B {
        A pAstruct;
    };