【发布时间】:2011-11-01 00:19:04
【问题描述】:
我正在使用一个简单的命令行应用程序,它接收 ASCI 文本并将其解释为命令。
我已尝试通过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 成员),并在我通过添加更多命令时自动编号 int 值(command_idx) COMMAND() 宏?
我也知道我可以在每个可能的命令上使用 strcmp() 调用,并与用户提供的输入进行比较,但我希望有一种通过 command_idx 值索引命令的直接方法,如反对 strcmp'ing 每次都针对大量命令列表(即: O(1) 而不是 O(n) )。我还想不惜一切代价避免多次键入命令名称。
谢谢!
【问题讨论】:
-
为什么要索引?最好使用函数指针...
-
一些编译器有一个
__COUNTER__宏。你可以使用它。
标签: c++ c c-preprocessor