解决C语言中的循环依赖
背景:使用面向对象思想,实现C语言的FSM状态机。
在结构体内嵌入函数指针模仿C++的成员函数。由于没用this指针,使用NET_FSM_S* fsm代替。
typedef struct s_NET_ACTION
{
int eEvent; //特定事件
void (*callBack)(NET_FSM_S* fsm); //事件发生后的处理回调函数
}NET_ACTION_ST;
typedef struct s_NET_STA_ATBLE
{
int eStatus; //某一个确定的状态
int iActCnt; //某一个确定的状态对应的事件总数
NET_ACTION_ST* stActTab; //状态对应的所有事件表数组指针,大小与iActCnt一致
}NET_STA_TAB_ST;
typedef struct s_NET_FSM
{
int curState; //当前状态
int curEvent; //当前事件
int iStaCnt; //状态总数
NET_STA_TAB_ST* curStaTab; //当前状态表指针
void (*init)(NET_FSM_S* fsm, NET_STA_TAB_ST* pTab);//初始化
void (*setStatus)(NET_FSM_S* fsm, int status); //FSM状态跳转接口
void (*eventHandle)(NET_FSM_S* fsm);//事件处理
}NET_FSM_S;
但是编译时产生如下报错:
NET_ARG_baseFSM.h(25,25): error C3646: “init”: 未知重写说明符
经查阅得知这3个结构体形成循环依赖,如下:
NET_ACTION_ST->NET_FSM_S->NET_STA_TAB_ST->NET_ACTION_ST....
其中“->”符号表示“依赖于”。修改后。
typedef struct s_NET_FSM NET_FSM_S;//前向声明,解决循环依赖
typedef struct s_NET_ACTION
{
int eEvent; //特定事件
void (*callBack)(NET_FSM_S* fsm); //事件发生后的处理回调函数
}NET_ACTION_ST;
.....
在文件头部添加NET_FSM_S的提前声明,告诉编译器有这个符号,在后文实现。

浙公网安备 33010602011771号