解决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的提前声明,告诉编译器有这个符号,在后文实现。

posted @ 2021-02-06 16:09  CyrilJiang  阅读(520)  评论(0)    收藏  举报