我正在研究一个使用void *保存数据的通用容器,我知道在C中运行时无法确定void *的类型。我想知道的是它是否可以这样做使用gcc扩展或任何其他技巧?我只需要在我的类型和任何其他类型之间确定,我的一个函数需要确定它是否传递给我的容器或任何其他类型,如果它是一个容器做其他什么都不做。
答案 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解释器以这种方式工作。否则,将标志传递给例程,或调用两个不同的例程。