这取决于你想得到多少花哨,有多少不同的命令,以及是否有可能频繁添加新命令。
您可以创建一个数据结构,将每个有效的命令字符串与相应的函数指针相关联 - 使用bsearch() 访问的排序列表可能没问题,尽管哈希表是一种可能具有更好性能的替代方案(因为有效命令是事先知道的,你可以用gperf之类的工具构造一个完美的哈希。
bsearch() 方法可能看起来像这样:
void func_aa(char args[11]);
void func_cc(char args[11]);
void func_xy(char args[11]);
struct command {
char *name;
void (*cmd_func)(char args[11]);
} command_tbl[] = {
{ "AA", func_aa },
{ "CC", func_cc },
{ "XY", func_xy }
};
#define N_CMDS (sizeof command_tbl / sizeof command_tbl[0])
static int comp_cmd(const void *c1, const void *c2)
{
const struct command *cmd1 = c1, *cmd2 = c2;
return memcmp(cmd1->name, cmd2->name, 2);
}
static struct command *get_cmd(char *name)
{
struct command target = { name, NULL };
return bsearch(&target, command_tbl, N_CMDS, sizeof command_tbl[0], comp_cmd);
}
然后,如果您有 command_str 指向来自串行端口的字符串,您将执行此操作以调度正确的函数:
struct command *cmd = get_cmd(command_str + 1);
if (cmd)
cmd->cmd_func(command_str);