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

C 在void*结构中初始化混合类型(常量)-可能吗?,c,struct,void-pointers,C,Struct,Void Pointers,当我将单个元素初始化为void结构时,它可以正常工作: void* CMD_ARRAY[] = { {"+++\r"}, {"+++\r"}, {"+++\r"}, }; 但是,当我尝试向结构添加更多元素时,即: void* CMD_ARRAY[] = { {"+++\r" , 4, 1300}, {"+++\r" , 4, 1300}, {"+++\r" , 4, 1300}, }; 这将导致一个错误: 应为“}” 第一个示例中的单个元素与结构的结构

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

void* CMD_ARRAY[] = 
{
  {"+++\r"},
  {"+++\r"},
  {"+++\r"},
};
但是,当我尝试向结构添加更多元素时,即:

void* CMD_ARRAY[] = 
{
  {"+++\r" ,  4,  1300},
  {"+++\r" ,  4,  1300},
  {"+++\r" ,  4,  1300},
};
这将导致一个错误:

应为“}”

第一个示例中的单个元素与结构的结构(也被视为元素)之间的区别是什么

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

更新:
所以我知道编译器不知道如何处理同一元素中的不同类型。是否有一种方法可以动态定义这些类型(即使用强制转换),而不实际定义此定义之外的结构(即使用结构数组)?

使用花括号作为初始值表示对结构化信息进行初始化。您正在初始化一个空指针数组。因此编译器需要一组他可以存储在这个数组中的指针。您的第二个变体不再是指针,它大约有12字节长。在单个空指针数组单元格中没有足够的空间进行此操作


此外,当我看到这段代码时,我感觉到一些不好的东西正在地平线上升起。你到底想做什么?

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

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

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

<>编辑:除了易读性的成本之外,考虑如果你决定在更高的层次上改变你的结构,将会发生什么。您必须在较低级别中进行大量查找/替换。您觉得这听起来不错吗?

“第一个示例中的单个元素与结构的结构之间有什么区别……”区别在于您没有告诉编译器它们的类型是什么。它不能只是猜测。我知道还有其他方法(例如定义结构),但如果我能用这种方法实现它,它会解决我的问题。@user2015194你的问题到底是什么?我想说,不管它是什么,都有一个比这个更好的方法来解决它。那么,我怎么能告诉编译器他有一个指向结构的指针数组(实际上没有在这个定义之外定义结构)?@user2015194你遇到了另一个严重的问题:你以后怎么知道这个结构是什么样子的我想说你的设计没有经过深思熟虑,在更高的层次上有一个定义。但是这种结构用于较低的层(不知道是否存在较高的层…)这里的解决方案似乎很简单:将定义放在较低的层中。所以你的“设计”是颠倒的!?虽然可以避免指针引用任何对象,但不能将其初始化为特定对象。定义必须在较低级别,或者必须由较高级别执行初始化。我有一个通用的设备层,用于激活不同的设备。通用数据结构在接口层中定义,它上面的应用程序可以使用通用结构(不知道他实际使用的是什么)。此初始化代码来自设备的最底层-我不想将接口中的定义包含到设备文件中,因此我只想初始化一个普通数据结构,稍后我会将其作为泛型类型。我希望我已经够清楚了:-)事实上,对我的朋友来说还不够清楚。为什么不将句柄(实际指向设备结构的指针)存储在此列表中,并在其他位置定义结构?应用程序层->使用通用设备类型。接口层->保存一个指向正确设备结构的指针(许多设备结构之一)。设备层->定义每个设备的特定结构(不知道是否存在具有泛型类型的更高层)。最后,避免定义结构的原因是,我不想将泛型类型从接口级别包括到设备级别,另一方面,我也不想将结构定义从一个层复制到另一个层。@user2015194 Ok,以及不发出类似
void*DeviceXYHandleGet(int num)的调用的原因
返回指向其结构实例的空指针是什么?您的初始化代码可以将此句柄传递给应用程序,应用程序会将其通过所有层传递给知道如何使用此数据的设备驱动程序?你不需要重复结构定义,你的软件的一部分需要知道具体的设备。我通过传递一个空指针来初始化正确的结构。这就是为什么我坚持一个空洞的结构。无论我从哪个设备收到它,这个空指针都将在上面的接口层铸造到泛型类型…谢谢!这正是我一直在等待的答案。但是,这不适用于:-(我已经定义了foo结构并收到:不允许转换为类型“foo”。我想这是armcc编译器的问题,而不是“C”为了解释为什么扩展实际上是一个坏主意,Seice刚刚被编辑过。请考虑下一步,明确定义结构中需要的结构。您可以把它放在一个.h文件中,包含EngEngress,和在您需要的每个文件中。抱歉,伙计们,这只是一段蹩脚的代码。它使代码变得不必要,难以阅读,并且声明struct ex的实例没有任何好处