假设一个函数将 void 指针作为参数,如下所示:int func(void *p);
我们如何确定或猜测 p 指向的类型?
4 回答
一般来说,你不能。在某些情况下,如果对 p 指向的内容有保证,您也许可以查看该地址及其之后的内容来找出答案。一般来说,你的函数应该知道它正在传递什么,除非它只是传递它。
C 中的数据和函数参数只是一堆集中在一起的位。除非您使用其中一些位来告诉您这些位是什么,否则没有一致的方法来识别它。
当然可以,而且也很容易。是C,随心所欲,随心所欲。
制作类型系统。将您传递的所有内容放入一个结构中,使第一个或两个字节成为幻数,以确定结构包含的超出幻数的内容。
制作一些函数来创建/获取/设置/销毁“类型化变量”。
制作一些其他函数以在运行时添加和注册新类型。
创建一些定义以使结构更易于阅读和类型转换。
在不知不觉中,您将拥有一个很好的专有类型系统,您可以将其用于您的项目,并且它总是会完全按照您的意愿和需要做,因为您创造了它。
你可以发疯,把它发展成一个完整的面向对象的系统。或者节省自己的工作,并使用所有其他已经发疯的人的工作 - http://en.wikipedia.org/wiki/GObject
简短的回答 - 你不能。
在 C 中,除非您提供运行时间信息,否则没有运行时间信息,但看看这个printf(3)
系列,看看用不匹配的格式规范和实际参数类型打自己的脚是多么容易。
类型系统是你的朋友。用它。
我遇到了类似的问题,我发现自己必须为编程语言项目编写指令集。我遇到了这个问题,因为我有一个指向函数的指针数组,以便可以枚举函数并在 for 循环中运行(用于在线帮助和语法等)。例如:
struct List_Str *(*InstructionSet[])(struct List_Str *ContextPrefix,struct List_Str *ContextSuffix)=
{
AAVF,Add,AddEmotions,AddEmoDebug,AddScope,...
};
现在您可以轻松地使用 char * 而不是 struct List_Str * 类型执行相同的操作,然后使用 snprintf 和 atoi 和 atof 以及其他转换函数将所有数据转换为字符串格式。如果您执行以下操作:
man isalpha
这向您展示了 ctype.h 中的许多函数,它们可以让您了解如何确定字符串中保存的数据类型。
将所有类型折叠成“字符串”格式允许极大的灵活性和规律性,但是将数据从字符串自动转换为整数、浮点数等是很费力的,但一旦例程被解放,就会很有成效。
如果您打算保存二进制数据,则不能使用字符串,因为 0 字符可以在二进制数据中,这会使 strlen 函数感到困惑。此外,您不知道 malloc 离开范围后的长度,因此建议在 char * 的前几个字节中存储数据之前取消引用的数据的长度。
最后一件事,我不建议将数据存储在 void * 中,它太模糊了。我建议使用 char *,因为它更具体一点,可以包含 void * 可以包含的所有内容,并且编译器会提前让您知道是否有任何问题。