2010-04-09 163 views

回答

20

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

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

+6

表决这个......你知道,因为你已经确定了你的程序其余部分的类型。如果这听起来很脆弱,那是因为它很脆弱。欢迎来到C.尽可能使用不易碎的系统。 – 2010-04-09 03:03:35

+0

我记得一些Motif(所有东西)的代码,在那里你会得到一个指针,你会看指针后的第一个字节来确定类型是什么,然后你恰当地处理这种类型。真是一团糟。 – WhirlWind 2010-04-09 03:05:25

+0

我不会在实践中这样做。我只是好奇这可以做到的方式。另外,一个GNU C扩展提供了typeof()运算符,我认为这个运算符能够确定解除引用的类型(即typeof(* p)),但我还没有使用它。 – Yktula 2010-04-09 03:09:56

5

简答 - 你不能。

在C语言中没有运行时间信息除非你提供给它,但看printf(3)家庭,看看它是多么容易搬起石头砸自己不匹配的格式规范,实际的参数类型的脚。

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

5

当然可以,而且也很简单。这是C,做你想做的,你想要的。

制作一个类型系统。把你传入的所有东西都放到一个结构体中,使第一或第二个字符成为一个幻数,以确定除了幻数之外的结构。

做一些函数来创建/获取/设置/销毁“类型变量”。

使一些其他功能在运行时添加和注册新类型。

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

你知道它之前,你将有你可以使用你的项目的一个很好的专有类型的系统,它会一直做的正是你想要的和需要的,因为你做到了。

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

+0

那么,当你编写的函数被你不控制的代码调用时,它是如何工作的? – WhirlWind 2010-04-09 03:53:20

+2

如果函数是由您不控制的代码调用的,那么您正在创建API /库,因此您必须记录接口以及创建/获取/设置/销毁类型化变量的函数。 如果由于某种原因被调用者是受控制的人,并且他们不希望/拒绝使用自定义的“输入”系统,那么你的运气不好。你必须让他们决定他们将如何传递你输入的信息,然后编码。 – Antebellum 2011-06-29 03:05:31

1

我遇到了类似的问题,我发现自己不得不为编程语言项目编写指令集。我想到了这个问题,因为我有一个指向函数的指针数组,以便可以枚举函数并在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 *所能包含的所有内容,并且如果任何内容看起来很腥,编译器会事先告诉您。

+2

如果您使用'char *'作为通用数据指针,那么在没有先转换为正确类型的情况下,意外取消引用指针就太容易了。 – 2013-05-23 00:10:26