【问题标题】:Master struct and dependencies主结构和依赖项
【发布时间】:2014-05-12 00:01:50
【问题描述】:

也许我问错了问题,但我正在尝试使用以下设计(包括为简洁而移除的防护装置)。

/* config.h */
#include "foo.h"
#include "bar.h"

struct config {
    struct foo foo;
    struct bar bar;
    ...
};

/* foo.h */
#include "config.h"
struct foo {
    ...
};

void foo_something(struct config *, ...);

/* bar.h */
#include "config.h"
struct bar {
    ...
};

void bar_something(struct config *, ...);

/* main.c */
int main(void)
{
    struct config config;
    /* initialize struct */
    foo_something(&config);
    bar_something(&config);
    print_config(&config);
}

这是经典的循环依赖问题。我可以通过添加一些前向声明并将#include "config.h" 移动到文件底部来使其工作,但感觉不对。所有这些结构过去都在同一个文件中,但我想将其分解以提高模块化。

有没有更好的方法,或者更好的设计模式来避免这个问题?

FWIW,我的目标平台是微控制器,所以我试图避免动态分配和全局变量。

【问题讨论】:

    标签: c struct include global circular-dependency


    【解决方案1】:

    一般来说,前向声明是一种方法。在您的情况下,如果foo_somethingbar_something 只需要config 的各个部分,似乎

    foo_something(&config.foo);
    bar_something(&config.bar)
    

    更直接。否则,struct foostruct bar 不够独立,不足以保证单独的头文件。

    也就是说,很难用这么少的细节提供任何建议。

    【讨论】:

    • 在大多数情况下,每个文件都倾向于只使用它们各自的结构。但是,有 1 或 2 个地方调用需要所有结构的函数。
    • 我会专注于如何重新设计这 1 或 2 个地方。如果没有明确的功能分离,就没有数据分离。抱歉含糊其辞。如果有更多细节,我可能会提供更好的建议。
    猜你喜欢
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    相关资源
    最近更新 更多