解决模块之间的循环依赖
我有三个头文件,并且存在一个无法解决的循环依赖。
我希望我的电池模块是可模块化的,且它的配置是外部化的。现在,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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。