标题: 无意中看到的一段代码 [打印本页]
作者: liuyang 时间: 2012-1-3 23:20
标题: 无意中看到的一段代码
void CmdRunning()
2 {
3 int iCmdNum = 0;
4 void (*pCmd)() = NULL;
5
6 do{
7 pCmd = NULL;
8 printf("请选择:0. 退出;1. 新建文件;2. 打开文件;3. 保存文件\n");
9 iCmdNum = getchar();
10 fflush(stdin);
11 switch(iCmdNum){
12 case '0':
13 printf("谢谢使用,再见!\n");
14 break;
15 case '1':
16 pCmd = CreateFile;
17 break;
18 case '2':
19 pCmd = OpenFile;
20 break;
21 case '3':
22 pCmd = SaveFile;
23 break;
24 default:
25 printf("对不起,你选择的数字不存在,请重新选择!\n");
26 }
27 if (NULL != pCmd){
28 pCmd(); // 与“(*pCmd)();”等价
29 }
30 }while('0' != iCmdNum);
31 }
这种方式代码虽然简洁,但是这种形式的扩展性很差。
struct myNode
{
char cmdNum; //编号
void (*pCmdFun)(void); //存储函数地址用的函数指针
};
//此处省略 ExitAll、CreatFile、OpenFile、Savefile函数实体的内容。
//下面是“字典”
struct myNode Cmd[]=
{
{'0' , ExitAll }, //这是一条记录,内容为:编号 函数首地址。
{'1' , CreatFile}, //这是一条记录,内容为:编号 函数首地址。
{'2' , OpenFile },
{'3' , SaveFile }
//以后如果要增加新的功能,只需在此增加一条“记录”即可,格式同上。(扩展性非常高!)
};
const int Length_Of_Cmd = sizeof(Cmd)/sizeof(Cmd[1]);//自动测量结构体数组的大小(字典有多少条记录)
void cmdRuning()
{
char cmdNum_input;
int n=0;
printf("请选择:0. 退出;1. 新建文件;2. 打开文件;3. 保存文件\n");
cmdNum_input = getchar();
fflush(stdin);
n = (cmdNum_input - '0');
if( n>0 && n<(sizeof(Cmd) / sizeof(Cmd[0]) ) )//数据边界检查
{// 直接映射到回调函数
Cmd[n].pCmdFun();//本句执行字典中跟输入的选项对应的函数
}
}
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |