C 如何在代码中获取对象的类型?
如何在C语言中计算对象的类型?我的目标是用C语言创建一个链表容器 假设我有一个函数,它接受一个空指针:C 如何在代码中获取对象的类型?,c,data-structures,linked-list,C,Data Structures,Linked List,如何在C语言中计算对象的类型?我的目标是用C语言创建一个链表容器 假设我有一个函数,它接受一个空指针: ... Foo *f; f = Allocate(f); ... void *Allocate(void *item) { return malloc(sizeof(f.GetType)); } 如何使上述语法成为可能?这是不可能的。一个void*指针,仅仅是指向内存的指针,没有更多,没有更多的信息附加到它。你不可能按照你的要求去做,你不知道要malloc多少字节 这就是为什么stdl
...
Foo *f;
f = Allocate(f);
...
void *Allocate(void *item)
{
return malloc(sizeof(f.GetType));
}
如何使上述语法成为可能?这是不可能的。一个
void*
指针,仅仅是指向内存的指针,没有更多,没有更多的信息附加到它。你不可能按照你的要求去做,你不知道要malloc
多少字节
这就是为什么stdlib.h
库中的函数作为参数
每个数组元素的大小
,以字节为单位。如果你的建议是可行的,那么
qsort
不需要这样的参数
也许你可以这样做:
...
Foo *f;
f = Allocate(f, sizeof(Foo));
...
void *Allocate(void *item, size_t size)
{
return malloc(size);
}
在C中,没有跨平台的方法来找出void*的底层类型,因为类型信息不存储在对象中。在C++中,这个特性已经被添加到对象中。
当然,您可以自己为自己的对象实现它,例如,将每个对象的大小存储在对象本身中,但对于系统对象,没有内置方式。使用
void*
将类型
获取到该对象是不可能的。如果您可以在调用Allocate()
之前计算Foo
的大小,然后获取大小并将其作为参数传递给Allocate()
,否则您应该使Foo
在Allocate()
中可见以查找大小 在C中实现这一点的唯一方法是创建自己的类型系统,在该系统中,您将typeinfo包含到所创建的类型中。例如在Objective-C中就是这样做的。在C中,所有类型都只是一系列字节,当您分配内存时,您只分配字节,您使用这些字节的目的与C编译器无关。C的(有争议的)优点在于它不这样做。空指针只是一个可以指向任何东西的地址。您可以创建自己的对象系统(使用“类型”字段和“数据”字段的结构是一种简单的方法)。从您的实现中,还可以将allocate
函数粘贴到Foo
结构中(假设是这样),该结构知道如何分配自身(此处已知类型)
这是不可能的。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));
}
顺便说一句,我正在使用Microsoft Compiler v9.0(Visual Studio 2008),跨平台代码不是我项目的优先事项。考虑到标记和跟踪上述语法所需的所有类型所涉及的工作,我会寻找另一种方法。在您的示例中,在C中执行此操作的通常方法是将sizeof(Foo)传递给Allocate,因为您在调用时知道类型。1)为什么需要知道类型才能创建链接列表?2)你明确地不想使用C++?
void *Allocate(typeof(*item) *item)
{
return malloc(sizeof(*item));
}