利用函数指针实现多分支选项(4)
0赞
发表于 10/8/2010 11:10:02 PM
阅读(2764)
在程序设计时,我们经常用if或switch语句作为条件判断,调用不同的函数,比如,在菜单驱动软件中,程序提示用户从菜单中选择一个选项,每一个选项都有一个不同的函数来完成其相应的功能。
如果使用函数指针,将指向每一个函数的指针存储在一个指向函数的指针变量中。例如,函数“void CreateFile();”的CreateFile会被解释为该函数的指针,我们可以将其赋给同类型的指针,从而实现一个函数指针调用不同的函数,这样会使程序更简洁、更专业。下面将利用函数指针来调用switch中的各个函数,详见程序清单4。
程序清单 4 利用函数指针实现多分支选项(V0.4)
1 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 }
这种方式代码虽然简洁,但是这种形式的扩展性很差。如果想要扩展功能,需要修改两个地方,第一、打印的帮助信息,它不能做到动态绑定,这也是程序员在开发过程中很容易被忽略的地方,因为它不会影响程序的使用功能;其次,对于添加case语句及处理函数,还有没有更好的实现方式呢?后面的例子会给大家更深入的讲解这个问题。
由此可见,除了可以通过“函数名”调用函数之外,还可以通过“指向函数的指针变量”调用相应的函数。但用函数名调用函数,只能调用所指定的一个函数;而如果通过指针变量调用函数,则更加灵活,可以根据不同情况先后调用不同的函数。
声明:在这一个系列中本着一题多解,步步深入以及尽量降低初学者的阅读难度减少枝叶代码的精神,很多细节都没有处理。例如举的例子中的函数的返回值都是void,函数中间没有安全检查,及其它的一些问题,通过例子中的几十行代码不可能做的面面俱到,在实际编程中是不能这样的,请同学们不要盲目效仿。
声明:在这一个系列中本着一题多解,步步深入以及尽量降低初学者的阅读难度减少枝叶代码的精神,很多细节都没有处理。例如举的例子中的函数的返回值都是void,函数中间没有安全检查,及其它的一些问题,通过例子中的几十行代码不可能做的面面俱到,在实际编程中是不能这样的,请同学们不要盲目效仿。
