【问题标题】:Please help me understand unfamiliar struct syntax in C请帮助我理解 C 中不熟悉的结构语法
【发布时间】:2013-11-10 15:11:37
【问题描述】:

我遇到了一些我以前从未见过的 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;
    }
}

我什至无法搜索谷歌寻求帮助,因为我不知道这种结构叫什么,而且看起来有些深奥。

我想要做的是创建更多这些结构,然后将循环放入一个单独的函数中并对其进行泛化,以便我可以根据某些条件向函数传递不同的结构。但是我不知道如何将结构分配给变量并将它们传递给函数。

【问题讨论】:

  • 此语法定义了名为commandsstructs 数组并对其进行初始化
  • 我认为它被称为“匿名结构”,因为它被用作无名类型。

标签: c struct


【解决方案1】:

我想做的是创建更多这些结构,然后将循环放入一个单独的函数中并对其进行泛化

那么你可能想给结构起一个名字(标签),像这样:

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 关键字会立即创建一个类型(只要遇到结构定义中的右大括号),因此您不必必须拥有单独的@987654324 @声明该结构类型的变量的定义,这些可以合并-这就是您发布的代码所做的。

【讨论】:

  • 啊,这很有意义。谢谢!
【解决方案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 },
};

如果类型定义放置在合适的位置(文件范围或标题中),则类型 Commandstruct Command 现在可以在其他地方使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多