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

Posted

技术标签:

【中文标题】typedef vs struct/union/enum 背后的基本原理是啥,难道不能只有一个命名空间吗?【英文标题】:What is the rationale behind typedef vs struct/union/enum, couldn't there be only one namespace?typedef vs struct/union/enum 背后的基本原理是什么,难道不能只有一个命名空间吗? 【发布时间】:2011-04-23 06:37:28 【问题描述】:

如果我在 C 中声明一个结构/联合/枚举:

struct Foo  int i ... 

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

struct Foo foo;

要放宽这个要求,我必须使用 typedef 为我的结构命名:

typedef struct Foo Foo;

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

许多其他语言没有这种区别,而且恕我直言,它似乎只会带来额外的复杂性。

【问题讨论】:

没有比 '#define LPFOO *FOO' 更复杂的地方 :( 但是,在我见过的大多数代码中,struct Foo 和 Foo 被赋予了不同的名称(例如 Foo_t 和 Foo 或其他你)即使它们与编译器位于不同的“命名空间”中。 能否请您提一下除了 C++ 之外的“其他语言”是什么? @Arun : C# 和 Java 不会将它们的类型放在“单独的标签命名空间”中(但它们可以在真正的命名空间中,包括全局命名空间,这与标签命名空间有点不同由C介绍) 【参考方案1】:

结构/记录是 C 之前对 B 的早期添加,就在 Dennis Ritchie 添加基本的“类型化”结构之后。我相信原始的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" 很有趣。

【讨论】:

我真的不明白这与这个问题有什么关系。 OP 询问为什么在声明变量而不是定义类型时需要说 struct Foo foo 而不是 Foo foo @detly:我想提供一些上下文,但我本可以更直截了当:因为标签一开始并不是真正的类型,并且要确保“声明语法模仿表达式”语法'仍然是可能的。 好吧,这更有意义。我从来没有真正想到指针类型之外的“声明语法模仿表达式语法”规则。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

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

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

从那时起,语言语法发生了很大的变化,我们在现代语言中看到的大部分东西在 C 中都没有了。用户定义的命名空间只是其中之一,我不认为“语法糖”在当时甚至存在。或者更确切地说,C 是语法糖的顶峰。

我们被这样的事情包围着。我的意思是,看看你的键盘:为什么我们有一个 PAUSE/BREAK 键?我想我已经好几年没按那个键了。

这是一个有意义的时代的继承。

【讨论】:

我经常按我的 PAUSE/BREAK 键。对我来说,最常见的用途是中断编译,或中断调试器。

以上是关于typedef vs struct/union/enum 背后的基本原理是啥,难道不能只有一个命名空间吗?的主要内容,如果未能解决你的问题,请参考以下文章

typedef struct vs struct定义[重复]

为啥我需要在 g++ 中使用 typedef typename 而不是 VS?

typedef struct vs struct - “struct”的存储大小未知[重复]

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

int vs NSNumber vs NSInteger

react-native 无法构建 ios:(错误 xcode Flipper)Typedef 重新定义不同类型('uint8_t'(又名'unsigned char')与'enum clockid_