Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么结构标记不是C中的类型名?_C - Fatal编程技术网

为什么结构标记不是C中的类型名?

为什么结构标记不是C中的类型名?,c,C,我很好奇C中这种行为的动机。是故意的还是意外的 struct tpoint // tpoint is not a type name { int x, y; }; typedef struct tpoint Point; // point is a type name. 我想知道里奇或标准委员会为什么选择这种行为。这是一个名称空间的问题。这样,我就可以拥有结构a,枚举a,联合a,而且它们都不含糊。在设计可能具有相似类型名称的框架时,它会有所帮助,但很快就会令人困惑。阅读时,Denni

我很好奇C中这种行为的动机。是故意的还是意外的

struct tpoint // tpoint is not a type name
{
    int x, y;
};

typedef struct tpoint Point; // point is a type name.

我想知道里奇或标准委员会为什么选择这种行为。

这是一个名称空间的问题。这样,我就可以拥有
结构a
枚举a
联合a
,而且它们都不含糊。在设计可能具有相似类型名称的框架时,它会有所帮助,但很快就会令人困惑。

阅读时,Dennis Ritchie在讨论胚胎C时,描述了他对
结构的意图:

我希望该结构不仅能够描述一个抽象对象,还能够描述一个可以从目录中读取的位集合

本节主要讨论这个想法是如何引入“数组指针等价性”的。然而,它确实说明了C的低级本质(一个
struct
表示一个“位集合”)


与此相反,C++使用了<代码>结构> /COD>作为<代码>类< /代码>的同义词,但所有的内容都是公开的。类实际上是面向对象编程中的一个概念,在面向对象编程中,将其标记作为类型处理更为自然。

但我想知道标准委员会或Dennis Ritchie为什么选择这种行为。这当然是真的,但我不知道这是最终的答案,或者是克尼汉先生和里奇先生的决定背后的原始原因。@Rayniery我们都不是他们——我们无法告诉你他们设计语言时的想法。我们只能猜测,而猜测永远不会带来任何好处。@Rayniery除非你能与Brian Kernighan交谈,与Dennis Ritchie会面,或在K&R书中找到什么,否则我怀疑你永远不会有一个明确的答案。如果我没有错的话,标记名称空间在结构、联合和枚举之间共享,也就是说,你不能用相同的标签名来定义所有三个甚至两个。丹尼斯·里奇不太可能回答你的问题。。。如果在基本原理文档()中找不到答案,那么这个问题可能无法回答……我想您会发现,
struct tag
typedef
早了几年,然后这一切都归结于向后兼容性。C++确实按你的意思去做。试着寻找“原始C”。我有一个tar文件“v6root.tar”,其中包含大量
struct
的源代码,但其中没有
typedef
。这应该是unixv6的源代码。Unix V7有
typedef
。最明显的原因是,仅使用
struct
union
,该语言仍然是上下文无关的-直到后来添加
typedef
,C语言才需要上下文敏感的解析器。