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