【问题标题】:Why aren't typedefs strongly typed?为什么 typedef 不是强类型的?
【发布时间】:2012-01-01 05:54:09
【问题描述】:

typedefs 没有被强类型化的原因是什么?有什么我看不到的好处还是由于向后兼容性?看这个例子:

typedef int Velocity;
void foo(Velocity v) {
    //do anything;
}
int main() {
    int i=4;
    foo(i); //Should result in compile error if strongly typed.
    return 0;
}

我不是要求解决方法来获得强类型数据类型,而只是想知道为什么标准不要求 typedefs 是强类型?

谢谢。

【问题讨论】:

  • 因为 C 语言是为想要完成任务的人而设计的,而不是为想要思考抽象类型系统的数学之美的人而设计的语言。 (作为一个欣赏这两项活动的人,我不会评判任何一项)。
  • @Stephen Canon:谁说抽象类型系统不能帮助你完成任务?调试因意外误用类型而导致的运行时错误在我的书中当然不算作“完成任务”。
  • @MichaelBorgwardt:我当然没有说他们不能。但是,它们可能被滥用。

标签: c typedef strong-typing


【解决方案1】:

因为 C 不是强类型的,而 typedef 源于这种想法

typedef 只是为了方便和可读性,它不会创建新类型。

【讨论】:

    【解决方案2】:

    typedef 只是用词不当(就像许多其他关键字一样)。把它想象成typealias

    相反,C 对兼容类型有一个完整的概念。例如,这允许将编译单元链接在一起,即使函数原型的声明仅使用兼容类型而不是相同类型。这一切都来自于日常生活中简单的实际需要,仍然能够为实现提供一些保证。

    【讨论】:

    • C 的主要思想真的不就是“都只是一点点,我们不要隐藏太多”吗?
    • @MichaelBorgwardt,不,我不这么认为。否则它不会有这个兼容类型的详细模型。
    【解决方案3】:

    即使Velocity 是与int 不同的类型,由于类型转换规则,您的代码也可以正常编译和工作。将Velocity * 类型的表达式传递给期望int * 等的函数是行不通的。如果要实现后一种类型的强制执行,只需将Velocity 设置为包含单个整数的结构或联合类型,现在您将拥有一个新的真实类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 2012-04-02
      相关资源
      最近更新 更多