我如何获得代码的对象的类型?

我如何找出C中的对象的类型? 我与这个目标是建立在C链表容器

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

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

如何使上述语法可能吗?

--------------解决方案-------------

这是不可能的。 一个void *指针,只是一个指针内存,仅此而已,没有更多信息被附加到它。 这是不可能做到你的要求,你可以不知道多少字节malloc

这就是为什么,在qsort从功能stdlib.h的库作为一个参数的size在每个数组元素的字节。 如果你认为是可能的,那么qsort就不需要这样的参数。

也许你可以做这样的事情:

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

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

在C语言中,没有跨平台的方式,找出潜在的类型为void *的,因为类型信息不是存储在对象。 在C ++中此功能已添加的对象。

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

它仅仅是不可能得到的type使用void *到该对象。 如果你可以计算的规模Foo之前调用Allocate()然后得到的大小和它作为参数传递到Allocate()否则你应该让Foo可见内部Allocate()找到的大小。

在C做到这一点的唯一方法是创建自己的类型系统,你包括所属类别为您创建的类型。 那是什么,例如在Objective-C已经完成。 在C中,所有类型的都只是一系列的字节数,当你分配你刚刚分配内存中的字节,你用什么这些字节是不关心的C编译器。

C的(有争议的)优点在于它不这样做。 一个空指针就是可能指向任何一个地址。 你既可以创建自己的对象系统(结构用“类型”字段和“数据”字段是一个简单的方法)。 从您的实现,也有可能粘的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 *Allocate(typeof(*item) *item)
{
return malloc(sizeof(*item));
}

分类:C# 时间:2015-03-15 人气:0
本文关键词: 数据结构,链表
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.423 (s). 10 q(s)