当我将单个元素初始化为void结构时,它可以正常工作:
void* CMD_ARRAY[] =
{
{"+++\r"},
{"+++\r"},
{"+++\r"},
};
但是,当我尝试在结构中添加更多元素时,即:
void* CMD_ARRAY[] =
{
{"+++\r" , 4, 1300},
{"+++\r" , 4, 1300},
{"+++\r" , 4, 1300},
};
这会导致错误:
期待“}”
第一个例子中的单个元素和结构的结构(也被视为元素)有什么区别?
如何使用混合类型实现此void结构的初始化?
更新: 所以我理解编译器不知道如何处理相同元素中的不同类型。有没有办法在运行中定义这些类型(即使用强制转换)而不实际定义此定义之外的结构(即使用结构数组)?
答案 0 :(得分:0)
使用花括号作为初始化程序意味着初始化结构化信息。您正在初始化一个void-pointer数组。所以编译器需要一组可以存储在这个数组中的指针。你的第二个变体不再是一个指针,它长约12个字节。在单个void-pointer数组单元格中没有足够的空间。
此外,我觉得在看这段代码时,地平线上出现了一些不好的事情。你究竟想做什么?
答案 1 :(得分:0)
你有一个指针数组,而不是一个结构数组。文字字符串初始化程序是可以分配给void指针的单个指针,要使用结构化初始化程序,必须将其分配给匹配的结构 - 否则编译器如何知道将数据放入内存中?
答案 2 :(得分:0)
我建议编译器不能猜测有关隐式结构声明的某些细节。例如,您的编译器如何猜测我希望下面示例中的y
为short
?
struct foo { char *x; short y; unsigned int z; };
void* CMD_ARRAY[] =
{
&(struct foo){"+++\r" , 4, 1300},
&(struct foo){"+++\r" , 4, 1300},
&(struct foo){"+++\r" , 4, 1300},
};
这可以以易读性为代价进行扩展:
void* CMD_ARRAY[] =
{
&(struct { char *x; short y; unsigned int z; }){"+++\r" , 4, 1300},
&(struct { char *x; short y; unsigned int z; }){"+++\r" , 4, 1300},
&(struct { char *x; short y; unsigned int z; }){"+++\r" , 4, 1300},
};
编辑:除了易读性之外,还要考虑如果您决定在更高级别更改结构,会发生什么。您必须在较低级别进行大量查找/替换。这对你来说听起来不错吗?