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



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

假设我有一个函数,它接受一个空指针:

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

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

这是不可能的。void *指针只是一个指向内存的指针,没有更多的信息。你不可能按照你的要求去做,你不知道malloc有多少字节。

这就是为什么stdlib.h库中的qsort函数将作为参数以字节为单位的CCD_ 5。如果你的建议是可行的,那么qsort不需要这样的参数。

也许你可以这样做:

...
Foo *f;
f = Allocate(f, sizeof(Foo));
...
void *Allocate(void *item, size_t size)
{
  return malloc(size);
}

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

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

使用该对象的void *来获取type是不可能的。如果您可以在调用Allocate()之前计算Foo的大小,然后获取大小并将其作为参数传递给Allocate(),否则您应该使FooAllocate()中可见以查找大小。

在C中实现这一点的唯一方法是创建自己的类型系统,在其中将typeinfo包含到创建的类型中。例如,Objective-C就是这样做的。在C中,所有类型都只是一系列字节,当你分配内存时,你只分配字节,你使用这些字节的目的与C编译器无关。

C的(可论证的)美妙之处在于它不做这件事。void指针只是一个可以指向任何的地址。您可以创建自己的对象系统(具有"类型"字段和"数据"字段的结构是一种简单的方法)。从您的实现来看,还可以将allocate函数粘贴到Foo结构中(假设它是),该结构知道如何分配自己(此处已知类型)。

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));
}

相关内容

  • 没有找到相关文章

最新更新