具有不同类型的链接列表

时间:2013-11-22 00:26:02

标签: c linked-list c99

如何创建一个列表,其中每个元素可以是不同的类型?

我现在正在做的事情就是这样:

typedef struct listitem
{
    int flavour;
    void *payload;
    struct listitem *next;
} listitem

在访问此列表中的项目时,我会检查flavour的值,然后将payload转换为相应的类型。这种做法对我来说似乎有点犀利。

在C99中执行此操作的标准方法是什么?

是否有某种方法可以推断出一个对象的类型,只给出它的地址?

3 个答案:

答案 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

相关问题