说一个函数将一个void指针作为参数,如下所示:int func(void *p);
我们如何确定或猜测p指向的类型?C:从void指针的外插类型
回答
一般来说,你不能。在某些情况下,如果有关于p点的保证,您可以查看该地址处及其后的内容以查找。通常,你的函数应该知道它传递的是什么,除非它只是传递它。
C中的数据和函数参数只是一堆集中在一起的数据。除非您使用其中一些位来告诉您这些位是什么,否则没有一致的方式来识别它。
当然可以,而且也很简单。这是C,做你想做的,你想要的。
制作一个类型系统。把你传入的所有东西都放到一个结构体中,使第一或第二个字符成为一个幻数,以确定除了幻数之外的结构。
做一些函数来创建/获取/设置/销毁“类型变量”。
使一些其他功能在运行时添加和注册新类型。
创建一些定义,以便更容易阅读和类型化结构。
你知道它之前,你将有你可以使用你的项目的一个很好的专有类型的系统,它会一直做的正是你想要的和需要的,因为你做到了。
你可能会发疯,并将其发展成像系统一样的完整对象。或者保存自己的工作,并使用所有其他已经发疯的人的工作 - http://en.wikipedia.org/wiki/GObject
那么,当你编写的函数被你不控制的代码调用时,它是如何工作的? – WhirlWind 2010-04-09 03:53:20
如果函数是由您不控制的代码调用的,那么您正在创建API /库,因此您必须记录接口以及创建/获取/设置/销毁类型化变量的函数。 如果由于某种原因被调用者是受控制的人,并且他们不希望/拒绝使用自定义的“输入”系统,那么你的运气不好。你必须让他们决定他们将如何传递你输入的信息,然后编码。 – Antebellum 2011-06-29 03:05:31
我遇到了类似的问题,我发现自己不得不为编程语言项目编写指令集。我想到了这个问题,因为我有一个指向函数的指针数组,以便可以枚举函数并在for循环中运行(例如,联机帮助和语法等)。例如:
struct List_Str *(*InstructionSet[])(struct List_Str *ContextPrefix,struct List_Str *ContextSuffix)=
{
AAVF,Add,AddEmotions,AddEmoDebug,AddScope,...
};
现在你可以很容易地做同样的事情用的char *而不是结构List_Str *类型,然后使用snprintf的和的atoi和ATOF等转换函数的所有数据转换成字符串格式。如果你做一个:
man isalpha
这说明你很多的ctype.h中的功能,可以让你的想法如何确定哪些类型的数据字符串内举行。
将所有类型折叠为“连续”格式允许极大的灵活性和规律性,但自动将数据从字符串转换为整数,浮点等等,这是艰难的,但是一旦例程被librified,就会产生效果。
如果你打算保存二进制数据,那么你不能使用字符串,因为0字符可以在二进制数据中,这会混淆strlen函数。此外,一旦它离开作用域,你不知道malloc'd的长度,因此在char *的前几个字节中推荐数据之前存储解除引用的数据的长度。
最后一件事,我不建议将数据存储在void *中,它太含糊。我建议使用char *,因为它更具体一些,可以包含void *所能包含的所有内容,并且如果任何内容看起来很腥,编译器会事先告诉您。
如果您使用'char *'作为通用数据指针,那么在没有先转换为正确类型的情况下,意外取消引用指针就太容易了。 – 2013-05-23 00:10:26
- 1. 绑定void *指向C++/Cli基本类型指针的指针
- 2. C++ void指针
- 3. 类的指针void *
- 4. 如何将void(*)()类型的指针转换为void *
- 5. c - 从中兼容的指针类型
- 6. 在C++中指向void的指针?
- 7. 返回void的C++/C函数指针*
- 8. 类型转换void指针结构类型
- 9. 将指针指向CLR类型以使用不安全的void *
- 10. 如何将指针数组的返回类型指定为void?
- 11. void指针
- 12. C指针类型铸造
- 13. 将一个void指针施放到一个任意类型的指针上
- 14. 什么是C++中的void指针?
- 15. 我应该使用哪种类型的指针? ptrdiff_t或void *?
- 16. 指针的类型?
- 17. C void *函数指针参数
- 18. 铸造指针对象为void *在C++
- 19. 试验在C++ void指针删除
- 20. 在C++中删除void *指针
- 21. Casting void指针,取决于数据(C++)
- 22. C++ void指针得到结构体
- 23. C语言中的Lazarus指针类型#
- 24. 转换的C指针类型
- 25. 指针类型的C#默认值
- 26. C++函数指针的返回类型
- 27. C++指针类
- 28. 指针/类C++
- 29. C++指向类的指针
- 30. void指针类型转换到不正确地将为pid_t
表决这个......你知道,因为你已经确定了你的程序其余部分的类型。如果这听起来很脆弱,那是因为它很脆弱。欢迎来到C.尽可能使用不易碎的系统。 – 2010-04-09 03:03:35
我记得一些Motif(所有东西)的代码,在那里你会得到一个指针,你会看指针后的第一个字节来确定类型是什么,然后你恰当地处理这种类型。真是一团糟。 – WhirlWind 2010-04-09 03:05:25
我不会在实践中这样做。我只是好奇这可以做到的方式。另外,一个GNU C扩展提供了typeof()运算符,我认为这个运算符能够确定解除引用的类型(即typeof(* p)),但我还没有使用它。 – Yktula 2010-04-09 03:09:56