C 这个“typedef”声明是什么?
我正在研究使用C语言的状态机,我从。 有一些我以前从未见过的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
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元素的一维数组