在 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的主要内容,如果未能解决你的问题,请参考以下文章