在void *结构中初始化混合类型(常量) - 是否可能?

时间:2013-01-27 09:02:27

标签: c struct void-pointers

当我将单个元素初始化为void结构时,它可以正常工作:

void* CMD_ARRAY[] = 
{
  {"+++\r"},
  {"+++\r"},
  {"+++\r"},
};

但是,当我尝试在结构中添加更多元素时,即:

void* CMD_ARRAY[] = 
{
  {"+++\r" ,  4,  1300},
  {"+++\r" ,  4,  1300},
  {"+++\r" ,  4,  1300},
};

这会导致错误:

  

期待“}”

第一个例子中的单个元素和结构的结构(也被视为元素)有什么区别?

如何使用混合类型实现此void结构的初始化?

更新: 所以我理解编译器不知道如何处理相同元素中的不同类型。有没有办法在运行中定义这些类型(即使用强制转换)而不实际定义此定义之外的结构(即使用结构数组)?

3 个答案:

答案 0 :(得分:0)

使用花括号作为初始化程序意味着初始化结构化信息。您正在初始化一个void-pointer数组。所以编译器需要一组可以存储在这个数组中的指针。你的第二个变体不再是一个指针,它长约12个字节。在单个void-pointer数组单元格中没有足够的空间。

此外,我觉得在看这段代码时,地平线上出现了一些不好的事情。你究竟想做什么?

答案 1 :(得分:0)

你有一个指针数组,而不是一个结构数组。文字字符串初始化程序是可以分配给void指针的单个指针,要使用结构化初始化程序,必须将其分配给匹配的结构 - 否则编译器如何知道将数据放入内存中?

答案 2 :(得分:0)

我建议编译器不能猜测有关隐式结构声明的某些细节。例如,您的编译器如何猜测我希望下面示例中的yshort

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},
};

编辑:除了易读性之外,还要考虑如果您决定在更高级别更改结构,会发生什么。您必须在较低级别进行大量查找/替换。这对你来说听起来不错吗?