繁体   English   中英

使用函数指针数组

[英]Use of array of function pointers

使用函数指针数组有什么好处? 除了减少C中的函数原型的数量。

正如许多人所指出的,函数指针可用于模拟C中面向对象的编程。

例如,可以使用简单的索引来选择适当的方法(也称为虚拟方法)。

#include <stdio.h>
#include <stdlib.h>

typedef void (*menu_function_t)();

void menu_error()
{
    printf("Invalid menu choice\n");
}

void menu_exit()
{
    exit(0);
}

void menu_function1()
{
    printf("You have selected 1\n");
}

void menu_function2()
{
    printf("You have selected 2\n");
}

menu_function_t menu_ptr[] = {
    menu_function1, menu_function2,  menu_exit, menu_error
};

int menu_num = sizeof(menu_ptr) / sizeof(menu_ptr[0]);

int validate_choice(int a)
{
    if(a < 0 || a > menu_num - 2) { return 3; }

    return a;
}

int main()
{
    int choice = 0;

    while(1)
    {
        printf("Choose item: \n");
        printf("0) Function 1\n");
        printf("1) Function 2\n");
        printf("2) Exit\n");
        scanf("%d", &choice);

        menu_ptr[ validate_choice(choice) ]();
    }

    return 0;
}

存在函数指针的数组(或其他数据结构)有多种用例。 通常,这种类型的机制允许程序根据运行时条件动态调用多个不同函数中的一个。

例如,您可以使用函数指针数组实现类似于OO语言的接口。 该数组将保存指向该接口的每个实现的指针。 数组索引将用于根据某些条件选择所需的实现。

如果你想将一个数值与一个操作相关联,你可以使用一个函数指针数组,尽管它实际上被称为一个映射。 它可以节省大量的switch声明。

array[CMD_OPEN] = OpenFunction;
array[CMD_CLOSE] = CloseFunction;

等等

void HandleCommand(int aCommand)
{
    array[aCommand]();
}

一个例子(很多存在)是你想要实现一系列变量“方法”:

typedef struct tag_IMAGEFORMAT
{
        struct tag_IMAGEFORMAT *next;
        const char      *name;
        IMAGEDETECTOR   *detect_routine;
        int             (*open_routine)         (DISKIMAGE *img, diskimgflags_t flags);
        size_t          (*read_routine)         (DISKIMAGE *img);
        int             (*close_routine)        (DISKIMAGE *img);
} IMAGEFORMAT;

C中的面向对象编程然后调用例如object->open_routine(..) ,其实现可以在运行时动态更改(在此示例中,取决于图像格式)。

在此示例中,多个图像格式共享一个通用API; 各种“检测器”一个接一个地运行,第一个匹配的“检测器”将其指针复制到“通用图像”对象。 之后,您可以操作图像而无需担心其实现细节(JPG,GIF,PNG,...)。

类似地,如果您需要实现函数的几个不同变体(例如图像过滤器),您可以将所有指针保持为数组,并通过索引到数组中选择合适的指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM