如何计算C中对象的类型?我的目标是在C中创建一个链表容器。
假设我有一个带有空指针的函数:
...
Foo *f;
f = Allocate(f);
...
void *Allocate(void *item)
{
return malloc(sizeof(f.GetType));
}
如何使上述语法成为可能?
答案 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));
}