为什么结构标记不是C中的类型名?
我很好奇C中这种行为的动机。是故意的还是意外的为什么结构标记不是C中的类型名?,c,C,我很好奇C中这种行为的动机。是故意的还是意外的 struct tpoint // tpoint is not a type name { int x, y; }; typedef struct tpoint Point; // point is a type name. 我想知道里奇或标准委员会为什么选择这种行为。这是一个名称空间的问题。这样,我就可以拥有结构a,枚举a,联合a,而且它们都不含糊。在设计可能具有相似类型名称的框架时,它会有所帮助,但很快就会令人困惑。阅读时,Denni
struct tpoint // tpoint is not a type name
{
int x, y;
};
typedef struct tpoint Point; // point is a type name.
我想知道里奇或标准委员会为什么选择这种行为。这是一个名称空间的问题。这样,我就可以拥有
结构a
,枚举a
,联合a
,而且它们都不含糊。在设计可能具有相似类型名称的框架时,它会有所帮助,但很快就会令人困惑。阅读时,Dennis Ritchie在讨论胚胎C时,描述了他对结构的意图:
我希望该结构不仅能够描述一个抽象对象,还能够描述一个可以从目录中读取的位集合
本节主要讨论这个想法是如何引入“数组指针等价性”的。然而,它确实说明了C的低级本质(一个struct
表示一个“位集合”)
与此相反,C++使用了<代码>结构> /COD>作为<代码>类< /代码>的同义词,但所有的内容都是公开的。类实际上是面向对象编程中的一个概念,在面向对象编程中,将其标记作为类型处理更为自然。但我想知道标准委员会或Dennis Ritchie为什么选择这种行为。这当然是真的,但我不知道这是最终的答案,或者是克尼汉先生和里奇先生的决定背后的原始原因。@Rayniery我们都不是他们——我们无法告诉你他们设计语言时的想法。我们只能猜测,而猜测永远不会带来任何好处。@Rayniery除非你能与Brian Kernighan交谈,与Dennis Ritchie会面,或在K&R书中找到什么,否则我怀疑你永远不会有一个明确的答案。如果我没有错的话,标记名称空间在结构、联合和枚举之间共享,也就是说,你不能用相同的标签名来定义所有三个甚至两个。丹尼斯·里奇不太可能回答你的问题。。。如果在基本原理文档()中找不到答案,那么这个问题可能无法回答……我想您会发现,struct tag
比typedef
早了几年,然后这一切都归结于向后兼容性。C++确实按你的意思去做。试着寻找“原始C”。我有一个tar文件“v6root.tar”,其中包含大量struct
的源代码,但其中没有typedef
。这应该是unixv6的源代码。Unix V7有typedef
。最明显的原因是,仅使用struct
和union
,该语言仍然是上下文无关的-直到后来添加typedef
,C语言才需要上下文敏感的解析器。