我正在编写一个文本编辑器,根据用户输入的第一个字符执行命令。
例如,如果用户输入r filename.foo
,则字母r将用于调用read_file()
功能。显而易见的方法是使用switch(buf[0])
,但我想使用函数指针数组,因此我可以说(*fn[buf[0])
而不是写出长switch
语句。 (有关此设计模式的进一步说明,请参阅Kernighan和Pike"编程实践"第221页。)
我尝试使用enum
将每个字符与一个整数相关联,enum { 'r', 'w', 't', '\n' };
将映射' r'到int 0,' w'到int 1,' t',到int 2,' \ n'到int 3,但C不允许使用字符。是否有一种优雅的方式来做到这一点?
答案 0 :(得分:2)
在C中执行此操作的正确方法是使用指定的初始值设定项。
#include <stdio.h>
void read(void)
{
puts("read");
}
void write(void)
{
puts("write");
}
typedef void (*function_map_t)(void);
function_map_t function_map[] = {
['r'] = read,
['w'] = write,
};
如果要修复数组的大小,请使用function_map [255]。根据标准的要求,所有缺失的条目都用零初始化。