首页 > 解决方案 > 在结构中使用结构数组时标量初始化器周围的大括号

问题描述

我正在尝试制作一个简单的菜单。为此,我想使用一个结构,它是 Menu 并包含一个菜单项的结构数组。

主菜单 - 程序 - 设置

菜单项包含一些进一步的信息,如回调。

struct menu_t {
    char* text;
    const uint32_t num;
    const struct menuitem_t *contents[MAX_MENU_CONTENTS];
};

struct menuitem_t {
    char* text;
    uint8_t type;
    void (*callback)(void);
}

static const struct menu_t mainMenu[] = {
    .name = "Main Menu",
    .num = 3,
    .contents = {
        {
        .text = "Programms",
        .type = MENU_SUB,
        .callback = 0,
        },
        {
        .text = "Settings",
        .type = MENU_SUB,
        .callback = 0,
        }
    }
};

但我总是得到错误

'const menuitem_t*' 类型的标量初始值设定项的大括号

标签: c++arraysstructinitializationlist-initialization

解决方案


...在结构中使用结构数组时

您没有结构数组。你有一个指向结构的指针数组。

要创建 N 个对象,您需要这些对象的数组。例如在这种情况下:

static const struct menuitem_t menu_items[MAX_MENU_CONTENTS] {
    {
    .text = "Programms",
    .type = MENU_SUB,
    .callback = 0,
    },
    {
    .text = "Settings",
    .type = MENU_SUB,
    .callback = 0,
    },
};

如果您不想将这些对象存储在类中,则可以初始化指向该数组中对象的指针:

static const struct menu_t mainMenu[] = {
    .name = "Main Menu",
    .num = 3,
    .contents = {
        menu_items + 0,
        menu_items + 1,
    },
};

您的程序的其他问题:

  • menu_t没有成员.name,但您尝试对其进行初始化。你的意思是.text
  • 指定的初始化程序还不是任何已发布的 C++ 标准的一部分。它们将在即将到来的 C++20 中引入。
  • char*不能用字符串字面量初始化(从 C++11 开始;在此之前不推荐使用转换),因为字符串字面量在 C++ 中是 const。将成员更改为const char*,或使用可变字符数组。

推荐阅读