【问题标题】:Braces around scalar initializer when using array of struct in a struct在结构中使用结构数组时标量初始化器周围的大括号
【发布时间】:2019-12-10 01:44:26
【问题描述】:

我正在尝试制作一个简单的菜单。为此,我想使用一个结构体,它是 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*”类型的标量初始化器周围大括号

【问题讨论】:

  • contents 是一个指针数组。你确定要那个吗?
  • contents 是指向menuitem_t 的指针数组,而不是menuitem_ts 的数组。
  • 没有指针数组给我一个错误,但现在它似乎编译没有任何错误。谢谢
  • 这看起来更像 C 而不是 C++——尤其是因为指定的初始化程序...

标签: c++ arrays struct initialization list-initialization


【解决方案1】:

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

您没有结构数组。你有一个 pointers 数组来构造。

要创建 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*,或使用可变字符数组。

【讨论】:

  • 非常感谢。我会这样使用它。我知道 char* 不能再用字符串初始化了,但我没有时间在任何地方修复它,我稍后会做。
【解决方案2】:

如果它确实是 C++17 代码,那么你有很多错别字。

例如结构menu_t不包含数据成员name

数据成员contents 是一个指针数组。但是它不是由指针初始化的。

在 C++ 中,字符串文字具有常量字符数组的类型。因此,由字符串字面量初始化的结构中的相应指针必须具有限定符 const

如果你正在初始化一个聚合,那么它的初始化列表必须用大括号括起来。

下面有一个演示程序,展示了如何初始化您的结构。

#include <iostream>
#include <cstdint>

enum { MENU_SUB };
const size_t MAX_MENU_CONTENTS = 2;

struct menuitem_t;

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

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

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

int main()
{
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多