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

Per*_*xty 8 c standards typedef declaration definition

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

定义和声明之间有什么区别? 区别很重要,在理智上它实现了两个重要的事情:

  1. 它突出了参考和指称之间的差异
  2. 这就是C如何在参考和引用之间实现连接的时间分离.

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

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

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

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

Kei*_*son 4

声明就是定义typedef

N1570 6.7p5:

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

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

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

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

enum foo { zero, one};
Run Code Online (Sandbox Code Playgroud)

认为这是and的定义,而不是or的定义没有多大意义。另一方面,、或声明虽然创建了一个以前不存在的类型,但并未定义作为该类型名称的标识符——并且对于s 和,可以使用标记名称(作为不完整类型)甚至在类型被定义之前。定义定义标识符,而不是(必然)它们所引用的实体。zeroonefooenum fooenumstructunionstructunion

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

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