C 这个“typedef”声明是什么?

C 这个“typedef”声明是什么?,c,multidimensional-array,function-pointers,typedef,designated-initializer,C,Multidimensional Array,Function Pointers,Typedef,Designated Initializer,我正在研究使用C语言的状态机,我从。 有一些我以前从未见过的typedef声明: typedef eSystemState(*const afEventHandler[last_State][last_Event])(void); 这里用的是: //定义有限状态机的有效状态和事件的表 静态afEventHandler状态机= { [Idle_State]={[Card_Insert_Event]=INSERCARDHandler}, [Card_Inserted_State]={[Pin_En

我正在研究使用C语言的状态机,我从。 有一些我以前从未见过的
typedef
声明:

typedef eSystemState(*const afEventHandler[last_State][last_Event])(void);
这里用的是:

//定义有限状态机的有效状态和事件的表
静态afEventHandler状态机=
{
[Idle_State]={[Card_Insert_Event]=INSERCARDHandler},
[Card_Inserted_State]={[Pin_Enter_Event]=enterpindhandler},
[Pin_Eentered_State]={[Option_Selection_Event]=OptionSelectionHandler},
[Option_Selected_State]={[Amount_Enter_Event]=EnterAmountHandler},
[Amount\u Entered\u State]={[Amount\u Dispatch\u Event]=AmountDispatchHandler},
};
有人能解释一下这是什么吗?这是完整的代码

#包括
//ATM机的不同状态
类型定义枚举
{
闲置状态,
卡插入状态,
宾州,
选项_选择_状态,
进入状态的金额,
最后的州
}eSystemState;
//不同类型的事件
类型定义枚举
{
卡片插入事件,
Pin_进入事件,
选项选择事件,
金额输入事件,
发送事件的金额,
最后一件事
}系统事件;
//二维数组的typedef
typedef eSystemState(*常量afEventHandler[上次状态][上次事件])(无效);
//函数指针的typedef
typedef eSystemState(*pfEventHandler)(无效);
//函数调用以分派金额并返回理想状态
eSystemState AmountDispatchHandler(无效)
{
返回空闲状态;
}
//函数调用以输入金额并返回金额状态
eSystemState EnterAmountHandler(无效)
{
返回金额\进入\状态;
}
//函数调用option select并返回option selected状态
eSystemState选项SelectionHandler(无效)
{
返回选项\u选择的\u状态;
}
//函数调用以输入pin并返回pin输入状态
eSystemState EnterPinHandler(无效)
{
返回引脚的状态;
}
//函数调用以处理轨迹数据并返回卡插入状态
ESSystemState InsertCardHandler(无效)
{
返回卡的插入状态;
}
int main(int argc,char*argv[])
{
eSystemState eNextState=空闲状态;
eSystemEvent-eNewEvent;
//定义有限状态机的有效状态和事件的表
静态afEventHandler状态机=
{
[Idle_State]={[Card_Insert_Event]=INSERCARDHandler},
[Card_Inserted_State]={[Pin_Enter_Event]=enterpindhandler},
[Pin_Eentered_State]={[Option_Selection_Event]=OptionSelectionHandler},
[Option_Selected_State]={[Amount_Enter_Event]=EnterAmountHandler},
[Amount\u Entered\u State]={[Amount\u Dispatch\u Event]=AmountDispatchHandler},
};
而(1)
{
//假设api读取下一个事件
eSystemEvent-eNewEvent=ReadEvent();
//检查空指针和数组边界
if((eNextState<代码> > p>让我们考虑TyBuffs

typedef eSystemState (*const afEventHandler[last_State][last_Event])(void);
一步一步

这个

声明一个二维数组。考虑到枚举数
last_State
lastEvent
等于
5
,则上述记录等于

afEventHandler[5][5]
这个

声明常量指针的二维数组(指针本身是常量)

最后这个

typedef eSystemState (*const afEventHandler[last_State][last_Event])(void);
声明指向类型为
eSystemState(void)
的函数的二维常量指针数组。即该函数具有返回类型
eSystemState
和参数列表
void

因此,名称
afEventHandler
是指向类型
essystemstate(void)

至于这个声明,

// Table to define valid states and event of finite state machine
static afEventHandler StateMachine =
{
    [Idle_State] ={[Card_Insert_Event]= InsertCardHandler },
    [Card_Inserted_State] ={[Pin_Enter_Event] = EnterPinHandler },
    [Pin_Eentered_State] ={[Option_Selection_Event] = OptionSelectionHandler},
    [Option_Selected_State] ={[Amount_Enter_Event] = EnterAmountHandler},
    [Amount_Entered_State] ={[Amount_Dispatch_Event] = AmountDispatchHandler},
};
然后,使用指定的初始值设定项声明并初始化上述类型的数组

下面是一个更为简化的示例,使用枚举对一维函数指针数组进行类似的typedef声明

#include <stdio.h>

typedef enum { Add, Subtract, Multiply, Divide, TotalOperations } Operation;

typedef int ( * const Action[TotalOperations] )( int, int );

int add( int x, int y )      { return x + y; }
int subtract( int x, int y ) { return x - y; }
int multiply( int x, int y ) { return x * y; }
int divide( int x, int y )   { return x / y; }

int main(void) 
{
    Action action =
    {
        [Add] = add, [Subtract] = subtract, [Multiply] = multiply, [Divide] = divide
    };
    
    int x = 100, y = 5;
    
    for ( int i = 0; i < TotalOperations; i++ )
    {
        printf( "%d\n", action[i]( x, y ) );
    }
    
    return 0;
}

让我们考虑TyBuffs

typedef eSystemState (*const afEventHandler[last_State][last_Event])(void);
一步一步

这个

声明一个二维数组。考虑到枚举数
last_State
lastEvent
等于
5
,则上述记录等于

afEventHandler[5][5]
这个

声明常量指针的二维数组(指针本身是常量)

最后这个

typedef eSystemState (*const afEventHandler[last_State][last_Event])(void);
声明指向类型为
eSystemState(void)
的函数的二维常量指针数组。即该函数具有返回类型
eSystemState
和参数列表
void

因此,名称
afEventHandler
是指向类型
essystemstate(void)

至于这个声明,

// Table to define valid states and event of finite state machine
static afEventHandler StateMachine =
{
    [Idle_State] ={[Card_Insert_Event]= InsertCardHandler },
    [Card_Inserted_State] ={[Pin_Enter_Event] = EnterPinHandler },
    [Pin_Eentered_State] ={[Option_Selection_Event] = OptionSelectionHandler},
    [Option_Selected_State] ={[Amount_Enter_Event] = EnterAmountHandler},
    [Amount_Entered_State] ={[Amount_Dispatch_Event] = AmountDispatchHandler},
};
然后,使用指定的初始值设定项声明并初始化上述类型的数组

下面是一个更为简化的示例,使用枚举对一维函数指针数组进行类似的typedef声明

#include <stdio.h>

typedef enum { Add, Subtract, Multiply, Divide, TotalOperations } Operation;

typedef int ( * const Action[TotalOperations] )( int, int );

int add( int x, int y )      { return x + y; }
int subtract( int x, int y ) { return x - y; }
int multiply( int x, int y ) { return x * y; }
int divide( int x, int y )   { return x / y; }

int main(void) 
{
    Action action =
    {
        [Add] = add, [Subtract] = subtract, [Multiply] = multiply, [Divide] = divide
    };
    
    int x = 100, y = 5;
    
    for ( int i = 0; i < TotalOperations; i++ )
    {
        printf( "%d\n", action[i]( x, y ) );
    }
    
    return 0;
}
afEventHandler
定义为无参数的函数指针的2D数组,并返回
essystemstate

 static afEventHandler StateMachine =
    {
        [Idle_State] ={[Card_Insert_Event]= InsertCardHandler },
        [Card_Inserted_State] ={[Pin_Enter_Event] = EnterPinHandler },
        [Pin_Eentered_State] ={[Option_Selection_Event] = OptionSelectionHandler},
        [Option_Selected_State] ={[Amount_Enter_Event] = EnterAmountHandler},
        [Amount_Entered_State] ={[Amount_Dispatch_Event] = AmountDispatchHandler},
    };
是定义类型的变量
状态机的初始化

 StateMachine[IdleState]
然后初始化为1D指针数组,以无参数运行,返回
essystemstate

{[Card_Insert_Event]= InsertCardHandler }
索引
Card\u Insert\u事件
corres元素的一维数组