Per*_*xty 8 c standards typedef declaration definition
我偶尔会看到一些问题,例如"声明和定义之间有什么区别":
定义和声明之间有什么区别? 区别很重要,在理智上它实现了两个重要的事情:
那么为什么C typedef
声明不被称为typedef
定义?
首先,它显然是一个定义.它定义了一个别名.新名称将被视为指现有的东西.但它确实将对特定参照物的引用联系在一起,毫无疑问是一个定义的陈述.
其次,typedec
如果是宣言,它不会被称为a 吗?
第三,它不会避免人们在尝试使用typedef进行前瞻性声明时所提出的所有令人困惑的问题吗?
声明就是定义typedef
。
N1570 6.7p5:
声明指定一组标识符的解释和属性。标识符的定义是该标识符的声明:
在 C99 中,最后两个要点被合并;C11 引入了声明相同内容两次的能力typedef
。
请注意,只有对象、函数、枚举常量和 typedef 名称可以具有定义。有人可能会争辩说:
enum foo { zero, one};
Run Code Online (Sandbox Code Playgroud)
认为这是and的定义,而不是or的定义没有多大意义。另一方面,、或声明虽然创建了一个以前不存在的类型,但并未定义作为该类型名称的标识符——并且对于s 和,可以使用标记名称(作为不完整类型)甚至在类型被定义之前。定义定义标识符,而不是(必然)它们所引用的实体。zero
one
foo
enum foo
enum
struct
union
struct
union
至于为什么在定义它的小节中不将其称为“定义”,它是第 6.7 节“声明”的一部分,该节涵盖了各种声明(其中一些也是定义)。术语定义在 6.7 的介绍部分中定义。
至于名称typedef
,多年来它引起了相当多的混乱,因为它并没有真正定义类型。也许typename
会是一个更好的选择,甚至typealias
。但由于它确实定义了标识符,因此typedef
并不完全具有误导性。