//今天看了个tftp的源码,为下面的typedef纠结,还好经过一段时间研究,终于看懂了。下面是学到的东西
//首先说明(* CMDFUNC)(char [][256],int pcount)是void,可猜测CMDFUNC是什么,下面会有揭晓
typedef void (* CMDFUNC)(char [][256],int pcount);
//定义CMDNUM类型
typedef struct _cmdnum{
char *cmd;
int num;
int paramcount;
CMDFUNC callback;
}CMDNUM,*PCMDNUM;
//cmdlist中放了一些东东,函数名是这次要讨论的
CMDNUM cmdlist[] = {
{"help",1,0,showhelp},
{"exit",2,0,quit},
{"get",4,1,getfile},
{"put",5,2,putfile},
{"connect",8,1,connectto}};
//已有的部分函数
void showhelp(char cmd[][256],int pcount);
void quit(char cmd[][256],int pcount);
void getfile(char cmd[][256],int pcount);
void putfile(char cmd[][256],int pcount);
void connectto(char cmd[][256],int pcount);
//程序中最炫的地方,通过这句话,只需要设置num的值就能调用不同函数,当然还有更细节地方,不讨论
cmdlist[num].callback(cmd,pcount-1);//执行相应动作,pcount参数个数,存储在cmd中
解读:
num可以是0/1/2/3/4
比如num = 0, cmdlist[0]这个结构被"help",1,0,showhelp填充
cmdlist[0]是CMDNUM型数据
程序中存在showhelp/quit/getfile/putfile/connectto这几个函数,cmdlist[num]中的最后一个参数是函数名,非字符串
cmdlist[0].cmdlist成功的将cmdlist[0]中的函数名变成showhelp函数名,并调用showhelp(char cmd[][256],int pcount)
成功原因:
typedef void (* CMDFUNC)(char [][256],int pcount);
CMDFUNC是一个指向(返回值为void,参数为char [][256],int pcount)的函数的指针
cmdlist[num].callback传递给函数的是showhelp函数名,是地址,一个指向函数showhelp的指针
将函数showhelp传过去,然后就Ok了,具体请参考《C程序设计教程》H.M.Deitl/P.J.Deitel 226页,机械工业出版社
使用了函数指针,指向函数的指针,实现了典型下拉菜单的功能,易扩展