如何创建一个列表,其中每个元素可以是不同的类型?
我现在正在做的事情就是这样:
typedef struct listitem
{
int flavour;
void *payload;
struct listitem *next;
} listitem
在访问此列表中的项目时,我会检查flavour
的值,然后将payload
转换为相应的类型。这种做法对我来说似乎有点犀利。
在C99中执行此操作的标准方法是什么?
是否有某种方法可以推断出一个对象的类型,只给出它的地址?
答案 0 :(得分:3)
不,C不提供反射功能,即根据地址推断对象类型的能力。你将不得不自己管理它。你做的是正确的,但你必须自己管理这种味道。其他人已经指出如何通过将所有替代类型放入联合来减轻疼痛,这样您就不必一直投射。你可能还可以编写一些隐藏所有工会的内联函数。得到一个想法:
typedef struct listitem
{
int flavour;
union {
int i;
char * str;
};
struct listitem * next;
};
int int_item(struct listitem * item)
{
if (flavour != FLAVOUR_INT)
error("Not an integer");
return item->i;
}
char * string_item(struct listitem * item)
{
if (flavour != FLAVOUR_STRING)
error("Not a string");
return item->str;
}
答案 1 :(得分:1)
指针你可以使用void *。您可以使用联合的其他类型:
typedef struct listitem
{
int flavour; // type of data held
union {
int i;
double d;
float f;
:
:
};
struct listitem *next;
} listitem
抱歉,我误解了你的问题。你自己管理着味道。
答案 2 :(得分:1)
还有另一种方式。
如果您的flavour
没有多少价值,可以将地址嵌入其中。与2的幂对齐的地址使其最低有效位为0。
In C11 you have a standard way of allocating aligned memory,然后可用于tag your pointers。