如何处理C

时间:2016-06-27 12:35:05

标签: c dataset singleton

我目前正在学习编码(主要是C语言,但也有其他语言),现在在几个项目中我遇到过同样的“问题”:

我经常需要处理任意数据集。例如,我可能需要编写一个程序,它将以标准形式接受一定数量的命令(例如,为了示例),但是我想制作一个灵活的代码,例如,如果我来稍后回到这个项目并希望添加其他命令,我希望能够轻松完成。

我需要在代码中的某个位置手动输入这些命令的名称。我目前喜欢的一种方法是使用一个结构数组,每个元素包含一个char *作为命令的名称,一个函数指针用于负责该命令的函数。

问题是,到目前为止,我还没有完全满足我的方式实现这个数组。

我从它得到的最接近的是通过一个单身人士,每次我需要数组我只是称我的单身人士,但从那时起我就知道单身人士构成的问题基本上与全局变量一样。我已经学习了一些关于依赖注入的知识,但这是一个似乎只适用于面向对象语言的原则。

有没有办法不将单身人士用于我想用C做什么?

TL; DR: 我需要在我的代码中构建任意数据集,如何以优雅且易于维护的方式实现它?

感谢所有花时间回答的人。

示例:

我有一个程序可以监听标准输入上的命令,然后执行这些命令。 每次我读取输入时,我都会将它与预定的命令列表(以字符串形式)进行比较,然后在命令匹配时执行相应的代码。

您将如何创建字符串集?您将如何创建与每个字符串对应的函数集?你如何将两套连在一起?您如何在任何地方轻松访问这个组合集?

到目前为止,我对此的回答是:

s_cmds *singleton(void)
{
    static s_cmds ret[] = {{"cmd1", &func_cmd1}, {"cmd2", &func_cmd2}, ...};
    return (ret);
}

结构:

struct s_cmds {
    char *cmd;
    void (*func_cmd)(...);
};

这样,无论我想如何使我的代码发展,如果我想添加一个命令,我只需要在我的单例中添加一个元素,如果我想在我的代码中的其他地方访问这个数组,我只需要打电话给单身人士。但这基本上就像使用全局变量一样吗?

有没有“更清洁”的方法呢?

2 个答案:

答案 0 :(得分:1)

您的描述非常模糊,但我认为您正在寻找X-Macros:

https://en.wikipedia.org/wiki/X_Macro

这是一个代码构造,用于将不同类型的相关代码绑定在一起。常见用例是处理错误代码及其文本表示。

答案 1 :(得分:0)

我不完全确定你的问题,但从它的声音来看,我认为你正在寻找像linked list这样的数据结构。您可以比使用常规数组更轻松地添加元素,即新命令。显然有优点或缺点,没有其他问题的知识,很难说你究竟能用什么。