如何计算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()
,否则您应该使Foo
在Allocate()
中可见以查找大小。
在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));
}