C:来自void指针的外推类型

Ykt*_*ula 13 c pointers void-pointers

假设一个函数将void指针作为参数,如下所示:int func(void *p);
我们如何确定或猜测p指向的类型?

Whi*_*ind 25

一般来说,你不能.在某些情况下,如果对p指向的内容有保证,您可以查看该地址及其后的内容以查找.一般来说,你的函数应该知道它传递的是什么,除非它只是传递它.

C中的数据和函数参数只是一堆混合在一起的.除非你使用其中一些位来告诉你这些位是什么,否则没有一致的方法来识别它.

  • 投票给你...你知道,因为你已经确定了你程序其余部分的类型.如果这听起来很脆弱,那是因为它很脆弱.欢迎使用C.尽可能使用不太脆弱的系统. (6认同)
  • 我猜想typeof会告诉你"void",因为编译器无法在编译时知道. (2认同)
  • typeof()无法可靠地推断void *的类型。如果该指针指向由编译器使用的标准内存分配库使用的堆分配器分配的对象,则它可能会做一些事情;但是,如果该指针指向由自定义堆分配器(您自己的新运算符)分配的对象,或由OS API(OLE SAFEARRAY)分配的对象,或者由另一种语言的代码分配的对象(通过以下方式公开的VB5 COM组件或POCO对象)托管C ++),这是不可能做的。 (2认同)

Ant*_*lum 7

当然可以,也很容易.它是C,做你想做的任何事,你想要它.

制作一个类型系统.将您传递的所有内容放入结构中,使第一个或第二个字节成为幻数,以确定结构包含的超出幻数的内容.

创建一些函数来创建/获取/设置/销毁"类型变量".

创建一些其他函数以在运行时添加和注册新类型.

创建一些定义,以便更容易阅读和类型化结构.

在您了解它之前,您将拥有一个可以用于您的项目的良好的专有类型系统,并且它将始终完全按照您的要求完成您想要和需要的系统.

你可能会发疯并将其发展成一个面向系统的完整对象.或者保存自己的工作,并使用已经疯狂的所有其他人的工作 - http://en.wikipedia.org/wiki/GObject

  • 如果从您无法控制的代码调用函数,那么您正在创建API /库,因此您必须记录接口,以及创建/获取/设置/销毁类型变量的函数.如果出于某种原因,被叫者是控制者,并且他们不想/拒绝使用您的自定义"打字"系统,那么你就不走运了.你必须让他们决定如何传递你输入的信息和代码. (2认同)

Nik*_*sov 6

简短的回答 - 你不能.

在C中没有运行时间信息,除非你提供它,但看看printf(3)家庭,看看用不匹配的格式规范和实际参数类型拍摄脚是多么容易.

类型系统是你的朋友.用它.