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

时间:2014-11-19 20:20:17

标签: c standards typedef declaration definition

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

What is the difference between a definition and a declaration? 区别很重要,在理智上它实现了两个重要的事情:

  1. 它突出了参考和指称
  2. 之间的区别
  3. 这就是C如何实现参考和参照物之间连接的时间分离。
  4. 那么为什么C typedef声明不被称为typedef定义?

    首先,它显然是一个定义。它定义了一个别名。新名称将被视为指现有的东西。但它确实将对特定参照物的引用所束缚,毫无疑问是一个明确的陈述。

    其次,如果是宣言,它不会被称为typedec吗?

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

1 个答案:

答案 0 :(得分:4)

typedef声明 是一个定义。

N1570 6.7p5:

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

  • 表示对象,导致为该对象保留存储空间;
  • 用于函数,包括函数体;
  • 表示枚举常量,是标识符的(唯一)声明;
  • 表示typedef名称,是标识符的第一个(或唯一)声明。

在C99中,最后两个要点合并在一起; C11引入了两次声明相同typedef的能力。

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

enum foo { zero, one};

认为这是zeroone定义,而不是foo或{{},这没有多大意义1}}。另一方面,enum fooenumstruct声明虽然创建了以前不存在的类型,但未定义标识符该类型的名称 - 对于unionstruct,即使在定义类型之前,也可以使用标记名称(作为不完整类型)。定义定义标识符,而不是(必然)定义它们所引用的实体。

至于为什么它不被称为"定义"在定义它的小节中,它是6.7和#34;声明"部分的一部分,它涵盖了所有类型的声明(其中一些也是定义)。术语定义在6.7的介绍部分中定义。

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