【问题标题】:Using designated initializers for initializing a 2D char array initializer in a struct emits an error C2078 in VS2013在 VS2013 中使用指定的初始化程序来初始化结构中的 2D 字符数组初始化程序会发出错误 C2078
【发布时间】:2016-06-09 03:41:17
【问题描述】:

我正在使用 VS2013。整个程序是 C,而不是 C++。

我可以像这样毫无问题地初始化一个“字符串数组”:

char titles[4][80] = { "Dad", "Idiot", "Donut Lover", "Fewl" }; // OK!

我有一个这样声明的结构:

typedef struct
{
    char name[80];
    char titles[4][80];
} Dude;

当我尝试像这样初始化结构时:

Dude homer =
{
    .name = "Homer",
    .titles = { "Dad", "Idiot", "Donut Lover", "Fewl" } // error?
};

我收到“错误 C2078:初始化程序太多”。这是因为数组初始化 - 如果我删除 .titles = { ... 行,错误就会消失。为什么我会收到此错误?在结构初始化器中完成这种类型的字符串初始化有不同的方法吗?

如果我将结构的声明更改为如下所示

typedef struct
{
    char name[80];
    char *titles[4];
} Dude;

错误消失了。然而,这不是我能做出的改变。代码库的其他部分要求此结构的大小正好为 400 字节。

此外,我很清楚我可以使用strcpy 来填写每个字段,但这并不能回答我的问题。

【问题讨论】:

  • 试试Dude homer = { "Homer", { "Dad", "Idiot", "Donut Lover", "Fewl" } };
  • AFAIK,VS2013 使用 C89 而 C89 不支持使用 { .item = … }。 (不是有某种名称吗?)。 GCC 给出warning: ISO C90 forbids specifying subobject to initialize [-Wpedantic],这表明它在 C89 中不受支持。
  • 你的代码是正确的;这可能是VS中的一个错误
  • 没关系,我找到了该语法的名称。它被称为“指定初始化程序”,它似乎是根据this 为 VS 2013 RTM 实现的
  • 我认为这行:.titles = { "Dad", "Idiot", "Donut Lover", "Fewl" } 应该更像:.titles[][80] = { {"Dad"}, {"Idiot"}, {"Donut Lover"}, {"Fewl"} }

标签: c visual-studio visual-studio-2013 struct designated-initializer


【解决方案1】:

在 C 中,这样做更容易:

Dude homer =
{
    "Homer",
    { "Dad", "Idiot", "Donut Lover", "Fewl" } // error?
};

不知道这是否有效,但您可以尝试:

Dude homer =
{
    .name = "Homer",
    .titles[] = { "Dad", "Idiot", "Donut Lover", "Fewl" } // error?
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多