【发布时间】: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