我有一个列表,我想在其中可以放置不同的类型。我有一个函数返回索引处的当前值:
void *list_index(const List * list, int index) {
assert(index < list->size);
return list->data[index];
}
数组中有多种类型,例如:
typedef struct structA { List *x; char *y; List *z; } structA;
typedef struct structB { List *u; char *w; } structB;
现在为了从数组中获取数据:
structA *A;
structB *B;
for(j=0... ) {
A = list_index(list, j);
B = list_index(list, j);
}
但现在我该如何找出返回值的类型呢?对于typeof(我使用的是GCC btw),这可能吗?
这是可能的,还是我要做一些不同的结构?
最佳答案
C完全在编译时处理类型和类型(没有动态类型),因此一旦将指针转换为“void*”,它就会丢失关于原始类型的任何信息。您可以将它转换回原始类型,但您需要通过其他方法知道这是什么。
通常的方法是在可能存储在列表类型中的所有对象的开头使用某种类型的标记或描述符。如:
typedef struct structA { int tag; List *x; char *y; List *z; } structA;
typedef struct structB { int tag; List *u; char *w; } structB;
enum tags { structAtype, structBtype };
您需要确保每次创建structA或structB时,都正确设置了标记字段。然后,可以将从list_index返回的void*转换为int*并使用它读取标记。
void *elem = list_index(list, index)
switch (*(int *)elem) {
case structAtype:
/* elem is a structA */
:
case structBtype:
/* elem is a structB */