【问题标题】:How to check the type of the variable in C at runtime?如何在运行时检查 C 中变量的类型?
【发布时间】:2012-01-27 16:55:19
【问题描述】:

是否可以在整个代码的任何给定点检查变量的类型?

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

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

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

【问题讨论】:

  • someFunction 内部的变量实际上int,因为你这么说。
  • 那么,C 编程语言没有提供在运行时检查变量类型的机制吗?
  • 在 C 中,类型只存在于编译时。在运行时,它只是一堆移动的比特。
  • 如果你关心 C++,(它可以被认为是 C 的超集),特别是微软 C++,并且对于对象类型,而不是原始数据类型,微软确实提供了 RTTI (运行时类型信息)。见en.wikipedia.org/wiki/Run-time_type_information

标签: c type-conversion


【解决方案1】:

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

您可以提高编译器警告级别以获得更好的检查(例如 gcc -ansi -pedantic -Wall),但我相信某些事情仍会根据需要强制执行。

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

【讨论】:

    【解决方案2】:

    在您的代码中,您可以依赖于您收到的类型与它们的声明方式相对应的事实。如果不是这样,您将无法编写任何重要的程序。

    C 中的类型信息仅在编译时可用。在运行时,这些信息都不存在,因此没有标准的内置方法,例如,告诉什么类型的对象隐藏在随机指针后面。
    如果您需要此类信息,请查看您的编译器是否有扩展(我不知道是否有),或者使用为此提供基础设施的框架(glib 有类似的东西我相信)。
    或者,如果您真的需要,也可以自己动手。

    或者使用C++,它确实有一些运行时类型信息支持,一般来说是一个更复杂的类型系统,但那是一种完全不同的语言。

    【讨论】:

    • @Mat,关于 “如果不是这种情况,您将无法编写任何非平凡的程序。”,您是说没有任何程序非平凡的 PHP/Javascript 程序?
    • @Pacerier:PHP 和 Javascript(以及其他一些)是动态类型的,语言语义是围绕它构建的。 C 是静态类型的。
    • @Mat,但是既然可以在不使用typeof 检查的情况下构建非平凡的 PHP/JS 程序,那为什么在 C 语言中不可能呢?
    • @Pacerier:即使您没有在代码中显式编写typeof 检查,动态类型语言的运行时/VM 也会根据实际(运行时)类型做不同的事情涉及的表达式(例如,将字符串解释为整数以进行乘法运算)。在 C 中,如果你最终弄乱了你的(静态)类型(例如错误的指针转换),你会得到未定义的行为 - 在运行时没有任何东西可以检查操作的有效性。
    • @Mat,其实 PHP/JS 代码根本不需要依赖类型杂耍。甚至没有一次。如果你不依赖它,那么它就不会被使用。你可以想象它就像C。
    猜你喜欢
    • 1970-01-01
    • 2019-04-18
    • 2020-06-20
    • 2011-04-07
    • 2018-02-08
    • 2010-10-02
    • 1970-01-01
    • 2011-12-04
    • 2021-07-25
    相关资源
    最近更新 更多