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