struct with pointer-to-parent-struct:最好的方法

时间:2016-09-21 04:44:52

标签: c pointers struct void-pointers

我有大量单独类型的数据(即:进程,文件,线程,函数等),这些数据是在简短的.c / .h文件中定义的。一旦我完成了各个部分的实施并完成了单元/代码覆盖测试,我就开始将这些部分连接在一起。

当前实现在代码中使用指针到父对象 - struct通过(void *)指针,即:

struct typeB {
    int B;
    void *parent;
};

struct typeC {
    int C;
    void *parent;
};

struct typeA {
    int a;
    struct typeB *pB;
    struct typeC *pC;
};

由于某些void *的复杂程度,我使用了struct个指针,如果我使用实际pointer-to-struct-type代替{{1},他们就不会编译}}

void *typeB需要相互交谈的一些功能,但它们很少见。此外,这两个typeC都不需要了解struct中的int a

我可以删除parent指针,并将我的函数原型/定义重构为简单的所有接受parent struct作为参数,访问子结构等,但它似乎有点过分,因为几个函数只需要访问(struct typeA *) / typeB结构及其元素。

是否存在事实上的(非货物崇拜编程)标准来处理这种结构组织(类似于"不要施放typeC"规则我经常在这个网站上看到这种情况)?

谢谢。

1 个答案:

答案 0 :(得分:2)

  

由于某些结构的复杂程度,我使用了void *指针   如果我使用实际的指向结构类型代替它们,它们将无法编译   无效*。

前言声明有什么问题?

struct typeA; // forward declaration

struct typeB {
    int B;
    struct typeA *parent;
};

struct typeC {
    int C;
    struct typeA *parent;
};

struct typeA {
    int a;
    struct typeB *pB;
    struct typeC *pC;
};

截至您的问题:如果您不想/需要将paren存储为结构的一部分,那么您将需要

a)将父地址作为参数传递,或者

b)定义静态变量,如struct typeA *current_parent;,并在调用任何使用子项的方法之前放置父结构的地址。

上一个解决方案虽然不是线程安全的,但容易出错。