如何在运行时检查 C 语言变量的类型?

9

在代码的任何给定点上,检查变量的类型是否可能?

例如,假设我声明char y = 1; 和函数int SomeFunction (int)。 然后,我将y传递给someFunction,它将被转换为int,最终将返回int

我知道这是因为函数声明。 然而,我想确认在someFunction内部,变量实际上是int类型,并且从someFunction返回的变量也是int类型。

这可以在C中完成,还是应该依赖于函数声明?C编程语言是否提供任何机制来在运行时检查变量类型?


2
someFunction 内的变量“实际上”是 int,因为你这么说。 - knittl
那么,C编程语言没有提供在运行时检查变量类型的机制吗? - James Raitsev
7
在C语言中,类型只存在于编译时。在运行时,它只是一堆比特在移动。 - Mat
如果你关心C++(可以看作是C的超集),尤其是Microsoft C++,以及对象类型而非原始数据类型,Microsoft确实提供了RTTI(运行时类型信息)。请参阅http://en.wikipedia.org/wiki/Run-time_type_information。 - Mike Nakis
2个回答

7
在你的代码中,可以依赖于手动声明的类型和传递过来的类型相对应。如果不是这种情况,你就无法编写任何非平凡的程序。
在C语言中,类型信息仅在编译时可用。在运行时,没有任何该信息的存在,因此没有标准的内置方法可以告诉你随机指针后面隐藏的对象的类型。
如果你需要这种信息,请查看您的编译器是否有扩展支持(我不知道是否有),或使用提供基础设施的框架(例如glib可能会提供相关功能)。
如果你真的需要它,也可以自己实现。
或者使用具有一定运行时类型信息支持和更精细类型系统的C++,但那是一种完全不同的语言。


@Mat,关于“如果那不是情况的话,你无法编写任何非平凡程序。”这句话,您的意思是说PHP / JavaScript没有任何非平凡的程序吗? - Pacerier
1
@Pacerier:PHP和Javascript(以及其他一些语言)是动态类型的,其语言语义是围绕此构建的。C是静态类型的。 - Mat
@Mat, 但既然可以在不使用 typeof 检查的情况下构建非平凡的PHP/JS程序,那么在C中为什么不可能呢? - Pacerier
@Mat,实际上PHP/JS代码根本不需要依赖类型转换。甚至一次也不需要。如果您不依赖它,则不会被使用。您可以想象它就像C语言。 - Pacerier
@Pacerier:typeof检查是无关紧要的。在JavaScript中,当你写a+b时,该表达式的含义由这两个变量的运行时类型确定,每次调用该表达式时这些类型可能不同。这在C中根本不同。类型在编译时固定,如果你不能依赖于一个你声明为int的变量在运行时实际上是一个int(这就是问题所在),那么你就会失败。 - Mat
显示剩余4条评论

0

C类型主要存在于编译时。

您可以提高编译器的警告级别以获得更好的检查(例如gcc -ansi -pedantic -Wall),但我认为有些东西仍然会被需要强制转换。

您可以使用联合来进行某些任务的手动类型管理,但在C中,通常最好只依赖于编译器进行类型检查。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接