解决模块之间的循环依赖

编程语言 2026-07-12

我有三个头文件,并且存在一个无法解决的循环依赖。

我希望我的电池模块是可模块化的,且它的配置是外部化的。现在,battery.h将查找表(lut)的类型定义为lut的使用由battery.c决定。但设置查找表需要包含battery.h。

battery_conf.h:[...]: error: array type has incomplete element type 'battery_lut_t' {aka 'struct battery_lut_st'}

我该如何以较好的方式解决这个问题?

sys_types.h

#ifndef SYS_TYPES_H
#define SYS_TYPES_H
#include <inttypes.h>
#include <stddef.h>
#include <stdint.h>
#endif /* SYS_TYPES_H */

typedef int16_t U_battery_t;    // Battery voltage mV

battery.h

#ifndef BATTERY_H
#define BATTERY_H

#include "sys_types.h"
#include "battery_conf.h"

typedef struct battery_lut_st {
    U_battery_t U;          // battery voltage
    uint8_t charge_perc;    // charge percentage [0..100]
} battery_lut_st;

#endif

battery_conf.h

#ifndef BATTERY_CONF_H
#define BATTERY_CONF_H

#include "sys_types.h"
#include "battery.h"

typedef struct battery_lut_st battery_lut_st;

const battery_lut_st battery_charge_lut[] = {
    {.U = 4200u, .charge_perc = 100u},
    {.U = 3000u, .charge_perc = 0u},
};

const uint8_t lut_row_count = 2;

#endif /* BATTERY_CONF_H */

battery.c

#include "battery.h"

uint8_t battery_charge_update(const uint16_t voltage)
{
    for (uint8_t i = 0; i < lut_row_count; i++)
    {
        if (battery_charge_lut[i].U <= voltage)
        {
            return battery_charge_lut[i].charge_perc;
        }
    }
}

解决方案

从头文件中移除不必要的#include和前向声明。仅向那些缺少标识符的文件添加#include。

#endif 的include guards必须是最后一行。

头文件中的常量必须是static的。

sys_types.h

#ifndef SYS_TYPES_H
#define SYS_TYPES_H

#include <stdint.h>

typedef int16_t U_battery_t;    // Battery voltage mV

#endif /* SYS_TYPES_H */

battery.h

#ifndef BATTERY_H
#define BATTERY_H

#include "sys_types.h"

typedef struct battery_lut_st {
    U_battery_t U;          // battery voltage
    uint8_t charge_perc;    // charge percentage [0..100]
} battery_lut_st;

#endif

battery_conf.h

#ifndef BATTERY_CONF_H
#define BATTERY_CONF_H

#include "battery.h"

static const battery_lut_st battery_charge_lut[] = {
    {.U = 4200u, .charge_perc = 100u},
    {.U = 3000u, .charge_perc = 0u},
};

static const uint8_t lut_row_count = 2;

#endif /* BATTERY_CONF_H */

battery.c

#include "battery.h"
#include "battery_conf.h"

uint8_t battery_charge_update(const uint16_t voltage)
{
    for (uint8_t i = 0; i < lut_row_count; i++)
    {
        if (battery_charge_lut[i].U <= voltage)
        {
            return battery_charge_lut[i].charge_perc;
        }
    }
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章