为什么typedef声明不称为typedef定义?

我偶尔会看到诸如“声明和定义之间有什么区别”的问题:

定义和声明有什么区别? 区别非常重要,在智力上它实现了两件重要的事情:

  • 它突出了参考和指称之间的差异
  • 这就是C如何使参考和指称之间的依恋时间分离。
  • 那么为什么一个C typedef声明不叫做typedef定义呢?

    首先,这显然是一个定义。 它定义了一个别名。 新的名字被认为是指现有的东西。 但它肯定会将参考文献绑定到特定参照物,无疑是一个定义性陈述。

    其次,如果它是一个声明,它不会被称为typedec吗?

    第三,当它们尝试使用typedef进行前向声明时,难道不会避免所有人提出的令人困惑的问题吗?


    typedef声明是一个定义。

    N1570 6.7p5:

    声明指定了一组标识符的解释和属性。 标识符的定义是对该标识符的声明:

  • 对于一个对象,导致为该对象保留存储空间;
  • 对于一个功能,包括功能体;
  • 对于枚举常量而言,是标识符的(唯一)声明;
  • 对于typedef名称,是标识符的第一个(或唯一)声明。
  • 在C99中,最后两个要点合并在一起; C11引入了两次声明相同typedef的能力。

    请注意,只有对象,函数,枚举常量和typedef名称可以有定义。 有人可能会争辩说,给出:

    enum foo { zero, one};
    

    把它看作zeroone定义,而不是fooenum foo是没有多大意义的。 另一方面, enumstructunion声明虽然创建了一个以前不存在的类型,但并未定义该类型名称的标识符 - 对于struct s和union ,标记名称可以即使在定义类型之前也要使用(作为不完整类型)。 定义定义标识符,而不是(必然)它们所指的实体。

    至于为什么它在定义它的小节中没有被称为“定义”,它是第6.7节“声明”的一部分,涵盖了各种声明(其中一些也是定义)。 术语定义在6.7的介绍部分中定义。

    至于typedef这个名字,由于它没有真正定义类型,因此多年来引起了相当多的混淆。 也许typename会是更好的选择,甚至是typealias 。 但是由于它确实定义了标识符, typedef并不完全具有误导性。

    链接地址: http://www.djcxy.com/p/23575.html

    上一篇: Why is a typedef declaration not called a typedef definition?

    下一篇: Dynamic Pivot table query with condition