GCC在运行时确定void *的类型

时间:2011-02-11 17:42:28

标签: c gcc

我正在研究一个使用void *保存数据的通用容器,我知道在C中运行时无法确定void *的类型。我想知道的是它是否可以这样做使用gcc扩展或任何其他技巧?我只需要在我的类型和任何其他类型之间确定,我的一个函数需要确定它是否传递给我的容器或任何其他类型,如果它是一个容器做其他什么都不做。

3 个答案:

答案 0 :(得分:4)

处理此问题的一种方法是使用函数的附加参数。另一种方法是将void *封装在一个结构中,该结构带来一些类型数据。编译器很可能无法在这里为您提供帮助。

答案 1 :(得分:2)

您可以实现自定义RTTI系统,例如:

typedef struct t_record {
    enum { type_A, type_B } type;
    union {
        struct {
            int foo;
            float bar;
        } A;
        struct {
            unsigned int n;
            char buf[128];
        } B;
    };
} record;

void eggs(int, float);
void salad(unsigned int n, char const * const);

void spam(record *r)
{
    if(r->type == type_A)
        eggs(r->A.foo, r->A.bar);

    if(r->type == type_B)
        salad(r->B.n, r->B.buf);
}

答案 2 :(得分:1)

一种方法是将数据类型的所有实例放在哈希表中,然后执行查找以查看arg是否在表中。另一种方法是从连续的内存区域分配数据类型的所有实例,并检查arg以查看它是否在该区域 - 早期的LISP解释器以这种方式工作。否则,将标志传递给例程,或调用两个不同的例程。