如何创建一个列表,其中每个元素都可以是不同的类型?
我现在正在做的事情是沿着这些路线:
typedef struct listitem
{
int flavour;
void *payload;
struct listitem *next;
} listitem
当访问该列表中的项目时,我会检查flavour
的值,然后将payload
强制转换为适当的类型。这种方法对我来说有点像大锤。
C99的标准方法是什么?
是否有某种方法可以在只给定对象地址的情况下推断对象的类型?
不,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;
}
指针,您可以只使用一个void*。可以使用并集的其他类型:
typedef struct listitem
{
int flavour; // type of data held
union {
int i;
double d;
float f;
:
:
};
struct listitem *next;
} listitem
对不起,我误解了你的问题。你必须自己调配口味。
还有另一种方法。
如果您的flavour
没有太多值,您可以将其嵌入地址中。与二次方对齐的地址的最低有效位为0。在C11中,您有一种标准的分配对齐内存的方法,然后可以使用它来标记指针。