周立功

利用函数指针实现多分支选项(4)

0
阅读(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,函数中间没有安全检查,及其它的一些问题,通过例子中的几十行代码不可能做的面面俱到,在实际编程中是不能这样的,请同学们不要盲目效仿。