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

cly*_*yfe 6 c semantics

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

struct Foo { int i ... }
Run Code Online (Sandbox Code Playgroud)

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

struct Foo foo;
Run Code Online (Sandbox Code Playgroud)

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

typedef struct Foo Foo;
Run Code Online (Sandbox Code Playgroud)

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

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

sch*_*hot 2

结构/记录是 C 语言出现之前对 B 语言的早期补充,就在 Dennis Ritchie 添加了基本的“类型化”结构之后。我相信原始struct语法根本没有标签,对于您创建的每个变量都是匿名的struct

struct {
    int  i;
    char a[5];
} s;
Run Code Online (Sandbox Code Playgroud)

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

/* is Foo a union or a struct? */
Foo { int i; double x; };
Foo s;
Run Code Online (Sandbox Code Playgroud)

或者打破对 C 来说至关重要的“声明语法模仿表达式语法”范式。

我怀疑这typedef是很晚才添加的,可能是在 C“诞生”几年后。

“C 是当时最高级别的语言”这一论点。似乎不正确。Algol-68 的出现早于它,并且有正确类型的记录。对于帕斯卡来说也是如此。

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