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

时间:2010-10-09 18:20:51

标签: c semantics

如果我声明了struct / union / enum:

struct Foo { int i ... }

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

struct Foo foo;

要放弃此要求,我必须使用typedef:

为我的结构设置别名
typedef struct Foo Foo;

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

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

3 个答案:

答案 0 :(得分:2)

在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的"The Development of the C Language"是一本有趣的读物。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

当时这可能是一种资产,语言的语法迫使你区分可能适合寄存器的类型,以及那些不适合的类型。

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

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

它是从有意义的时间继承的。