在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)?
许多其他语言没有做出这种区分,似乎它只会带来额外的复杂程度恕我直言.
结构/记录是 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 语言的发展”是一本有趣的读物。
| 归档时间: |
|
| 查看次数: |
1154 次 |
| 最近记录: |