我遇到过一些我以前从未见过的C语法:
static struct {
char *name;
void (*f)(int a, int b, int c);
} commands[] = {
{ "cmd1", func1 },
{ "cmd2", func2 },
{ "cmd3", func3 },
};
这适用于将用户输入命令与以下各个函数之一匹配的命令解析器:
for (int i = 0; i < N; ++i) {
if (strcmp(args[0], commands[i].name) == 0) {
(commands[i].f)(a, b, c);
return;
}
}
我甚至无法搜索谷歌寻求帮助,因为我不知道这种结构被称为什么,而且看起来有些深奥。
我想要做的是创建更多这些结构,然后将循环放入一个单独的函数并对其进行概括,以便我可以根据特定条件传递函数不同的结构。但是我无法弄清楚如何将结构分配给变量并将它们传递给函数。
答案 0 :(得分:3)
我想要做的是创建更多这些结构,然后将循环放入一个单独的函数并将其推广
然后你可能想给结构命名(标记),如下所示:
struct command {
const char *name; // notice the `const', by the way!
void (*f)(int a, int b, int c);
};
并隔离类型定义和变量声明:
struct command commands[] = {
{ "cmd1", func1 },
{ "cmd2", func2 },
{ "cmd3", func3 },
};
诀窍是struct
关键字会立即创建一个类型(一旦遇到结构定义中的右括号),所以你不必必须分开struct
声明和该结构类型的变量的定义,这些可以合并 - 这就是您发布的代码所做的。
答案 1 :(得分:2)
成员void (*f)(int a, int b, int c);
是一个指向函数的指针,该函数返回void
并获取3 int
个参数。
请注意,您无法创建此类型的任何其他变量,因为该结构没有标记。由于同样的原因,您也无法将此结构传递给任何其他函数。
typedef struct Command
{
char *name;
void (*f)(int a, int b, int c);
} Command;
static Command commands[] =
{
{ "cmd1", func1 },
{ "cmd2", func2 },
{ "cmd3", func3 },
};
如果类型定义放在合适的位置(在文件范围或标题中),现在可以在其他地方使用类型Command
或struct Command
。