我正在使用一个简单的命令行应用程序,它接受 ASCII 文本并将其解释为命令。
我尝试通过以下示例最小化此应用程序中的冗余http://gcc.gnu.org/onlinedocs/cpp/Concatenation.html.
例如:
考虑一个解释命名命令的 C 程序。可能需要一个命令表,也许是一个声明如下的结构数组:
struct command
{
char *name;
void (*function) (void);
};
struct command commands[] =
{
{ "quit", quit_command },
{ "help", help_command },
...
};
不必为每个命令提供两次名称,一次在字符串常量中,一次在函数名称中,这样会更清晰。使用命令名称作为参数的宏可以使这一过程变得不必要。字符串常量可以通过字符串化创建,函数名称可以通过将参数与“_command”连接来创建。这是如何完成的:
#define COMMAND(NAME) { #NAME, NAME ## _command }
struct command commands[] =
{
COMMAND (quit),
COMMAND (help),
...
};
现在,假设我想要一个命令字符串和索引(即:int)值,而不是字符串和函数指针。
struct command
{
char *name;
int command_idx;
};
现在,我有一种命名命令的方法,并且有某种索引,我可以稍后使用它以编程方式识别每个命令。例如,我有一个对命令索引进行操作的 switch 语句。如果我想处理这些索引,我必须首先手动设置值。
我可以手动创建枚举数据类型,但随后我在单独的枚举语句中定义了枚举常量。 IE:
枚举命令 { cmd_quit = 0, cmd_help }
最后,我仍然需要输入每个命令名称两次:一次通过 COMMAND() 宏,另一次在我的枚举中。
是否有任何使用 C 预处理器的方法允许我创建一个宏,创建“命令”结构(带有字符串和 int 成员),并在我通过 COMMAND() 添加更多命令时自动对 int 值 (command_idx) 进行编号宏?
我还知道我可以对每个可能的命令使用 strcmp() 调用,并与用户提供的输入进行比较,但我希望有一种通过 command_idx 值对命令进行索引的直接方法,而不是 strcmp每次都针对大量命令列表(即: O(1) 而不是 O(n) )。我还想不惜一切代价避免多次键入命令名称。
Thanks!