typedef vs struct / union / enum背后的基本原理是什么,不能只有一个命名空间?

在C中,如果我声明struct / union / enum:

struct Foo { int i ... } 

当我想使用我的结构时,我需要指定标签:

 struct Foo foo; 

要放弃这个要求,我必须使用typedef为我的结构添加别名:

 typedef struct Foo Foo; 

为什么默认情况下不能在同一个“命名空间”中包含所有类型/结构/任何内容? 在每个变量声明中要求声明标记的决定背后的理由是什么(除非typdefe’d)?

许多其他语言没有做出这种区分,似乎它只带来了额外的复杂程度恕我直言。

在Dennis Ritchie添加了基本的“打字”结构之后,结构/记录是B的一个非常早的前C加法。 我相信原始的struct语法根本没有标记,因为你创建了一个匿名struct每个变量:

 struct { int i; char a[5]; } s; 

之后,添加了标签以实现结构布局的重用,但它并不真正被视为真正的“类型”。 此外,删除struct / union将使解析不可能:

 /* is Foo a union or a struct? */ Foo { int i; double x; }; Foo s; 

或打破对C语言如此基础的‘声明语法模仿表达式语法’范式。

我怀疑typedef添加时间很晚,可能是在C诞生后的几年。

论证“C是当时最高级的语言。” 似乎不对。 Algol-68早于它并且具有适当类型的记录。 帕斯卡也是如此。

如果您想更多地了解C的历史,您可能会发现Ritchie的“C语言的发展”是一本有趣的读物。

好吧,其他语言通常也支持命名空间。 C没有。

它可能不是原因,但至少拥有这个自然命名空间是有意义的。

有趣的问题! 这是我的想法。

当C被创建时,汇编语言几乎没有抽象。 有FORTRAN,B和其他人,但当C出现时,它可以说是现存最高级别的语言。 它的目标是提供足够强大的function和语法来创建和维护操作系统,并且它取得了显着的成功。

认为当时将系统移植到新平台意味着重新编写和调整组件到平台的汇编语言。 随着C的发布,它最终归结为移植C编译器,并重新编译现有代码。

当时可能是一种资产,语言的语法迫使您区分可能适合寄存器的类型和不能适合的类型。

从那时起,语言语法已经发生了很多变化,我们习惯在现代语言中看到的大部分内容在C中都缺失。用户定义的命名空间只是其中之一,我不认为“语法糖”的概念“当时甚至存在。 或者更确切地说,C是语法糖的高峰期。

我们周围有这样的事情。 我的意思是,看看你的键盘:我们为什么要使用PAUSE / BREAK键? 多年来我一直认为我没有按过那把钥匙。

它是从有意义的时间inheritance的。