Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在代码中获取对象的类型?_C_Data Structures_Linked List - Fatal编程技术网

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

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

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

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