【发布时间】:2012-11-22 17:18:47
【问题描述】:
请考虑以下两种结构:
typedef struct {
int num_data;
char * name_data;
int data[];
} part_t;
typedef struct {
int num_parts;
char * name_parts;
part_t parts[];
} container_t;
理想情况下,我可以像这样初始化一个容器:
const container_t container = {
2,
"Name of first container",
{
{ 4, "Name of first part", { 1, 2, 3, 4 } },
{ 5, "Name of first part", { 1, 2, 3, 4, 5 } }
}
};
我的编译器说:“错误:初始化器太多”
【问题讨论】:
-
这甚至不是一个简单的可变长度结构的工作原理......先尝试一个更简单的例子。
-
这是一个“灵活的数组成员”而不是 VLA。
-
简而言之:您无法初始化灵活的数组成员,并且拥有一个带有灵活数组成员的
structs 数组是等待发生的索引灾难。 -
@DanielFischer:从概念上讲,它并不比
int foo[] = {1,2,3,4};差,如果允许的话,我肯定遇到过这样的事情会很有用的地方。如果某些编译器允许这样的构造,我不会感到惊讶,因为很清楚任何可以处理它的编译器上的语义“应该是”[在初始化数据区域中分配适当数量的空间,让结构名称代表一个在地址处的左值,并且 sizeof(structname) 等于分配的大小]。尽管该功能很有用,但我不知道它是否有用到足以证明实施它的合理性。 -
@supercat 你只是在谈论初始化一个灵活的数组成员,我猜?是的,这有时会很有用,但这意味着类型取决于灵活数组成员的长度,那么您将拥有
struct foo<N>(借用一点 C++ 模板符号)。如果实现支持 VLA,我想有可能实现。但这将是对语言的重大改变。
标签: c struct constants variable-length-array