如何在代码中获取对象的类型?

时间:2012-01-09 06:13:59

标签: c data-structures linked-list

如何计算C中对象的类型?我的目标是在C中创建一个链表容器。

假设我有一个带有空指针的函数:

...
Foo *f;
f = Allocate(f);
...

void *Allocate(void *item)
{
  return malloc(sizeof(f.GetType));
}

如何使上述语法成为可能?

6 个答案:

答案 0 :(得分:2)

那是不可能的。一个void *指针,只是一个指向内存的指针,仅此而已,不再附加任何信息。不可能做你要求的事情,你不知道malloc有多少字节。

这就是为什么来自stdlib.h库的qsort函数作为参数 每个数组元素的size字节。如果你的建议是可能的,那么 qsort不需要这样的参数。

也许你可以这样做:

...
Foo *f;
f = Allocate(f, sizeof(Foo));
...

void *Allocate(void *item, size_t size)
{
  return malloc(size);
}

答案 1 :(得分:2)

在C中,没有跨平台的方法来找出void *的基础类型,因为类型信息没有存储在对象中。在C ++中,已为对象添加了此功能。

你当然可以自己为你自己的对象实现它 - 例如 - 在对象本身中存储每个对象的大小,但是对于系统对象,没有内置的方法。

答案 2 :(得分:1)

无法使用type void *获取该对象。如果您在调用Foo之前可以计算Allocate()的大小,那么请获取大小并将其作为参数传递给Allocate(),否则您应该在Foo内看到Allocate() 1}}找到大小。

答案 3 :(得分:1)

在C中执行此操作的唯一方法是创建自己的类型系统,其中包含typeinfo到您创建的类型。这就是在Objective-C中所做的事情。在C中,所有类型只是一系列字节,当你分配内存时,你只分配字节,你使用这些字节的内容与C编译器无关。

答案 4 :(得分:1)

C的(可论证的)之美是它不会这样做。 void指针只是一个可以指向任何的地址。您可以创建自己的对象系统(具有“类型”字段和“数据”字段的结构是一种简单的方法)。从您的实现中,也可以将allocate函数粘贴到Foo结构中(假设它是),它知道如何分配自身(这里的类型已知)。

答案 5 :(得分:1)

void *Allocate(void *item)
{
  return malloc(sizeof(f.GetType));
}

这是不可能的。 ISO C语言不提供通过变量获取类型信息的任何工具。 Gcc的扩展包含一个名为'typeof'的运算符,它可以从真实类型中获取类型信息。如:

typeof (x[0](1))
int a; typeof (a) b; b = a;

但即使typeof也无法从void指针获取真实的类型信息。以下代码无法成功编译:

void *Allocate(typeof(*item) *item)
{
  return malloc(sizeof(*item));
}