在 VS2013 中使用指定的初始化程序来初始化结构中的 2D 字符数组初始化程序会发出错误 C2078

Posted

技术标签:

【中文标题】在 VS2013 中使用指定的初始化程序来初始化结构中的 2D 字符数组初始化程序会发出错误 C2078【英文标题】:Using designated initializers for initializing a 2D char array initializer in a struct emits an error C2078 in VS2013 【发布时间】: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" 【参考方案1】:

在 C 中,这样做更容易:

Dude homer =

    "Homer",
     "Dad", "Idiot", "Donut Lover", "Fewl"  // error?
;

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

Dude homer =

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

【讨论】:

以上是关于在 VS2013 中使用指定的初始化程序来初始化结构中的 2D 字符数组初始化程序会发出错误 C2078的主要内容,如果未能解决你的问题,请参考以下文章

完全重新初始化vs2013

VS 2013 的类内成员初始化程序失败

VS2013中C99支持的官方状态是啥?

错误 C2536 的解决方法:无法在 Visual Studio 2013 中为数组指定显式初始化程序

C++11 VS2013类POD成员初始化

vs2013 sqlite3 错误 C4703