我很好奇C中這種行爲的動機是故意還是意外?爲什麼結構標籤不是C中的類型名稱?
struct tpoint // tpoint is not a type name
{
int x, y;
};
typedef struct tpoint Point; // point is a type name.
我想知道爲什麼裏奇或標準委員會選擇了這種行爲。
我很好奇C中這種行爲的動機是故意還是意外?爲什麼結構標籤不是C中的類型名稱?
struct tpoint // tpoint is not a type name
{
int x, y;
};
typedef struct tpoint Point; // point is a type name.
我想知道爲什麼裏奇或標準委員會選擇了這種行爲。
這是一個命名空間的事情。這樣,我可以有struct a
,enum a
,union a
,它們都不含糊。它有助於設計可能具有相似類型名稱的框架,但它可能會快速混淆。
但我想知道爲什麼標準委員會或Dennis Ritchie選擇了這種行爲。 – Rayniery
這當然是對的,但我不知道這是確切的答案,還是Kernighan和Ritchie作出決定背後的原始推理。 –
@Rayniery我們都不是他們 - 我們不能告訴你他們在設計語言時想的是什麼。我們只能推測,投機決不會導致任何好事。 –
在閱讀The Development of the C Language,當丹尼斯里奇討論胚胎Ç他描述了他的意圖爲struct
:
我想要的結構不僅是表徵一個抽象的對象,但也描述位的集合可能會從目錄中讀取。
該部分主要討論這個想法如何導致「陣列< - >指針等價」的引入。然而,它確實與C的低級特性有關(struct
代表「比特集合」)。
相比之下,C++使用struct
作爲class
的一種同義詞,但一切都是公開的。 A class
實際上是面向對象編程中的一個概念,其標籤被視爲一種類型更爲自然。
丹尼斯·裏奇不太可能回答你的問題......如果答案不在理由文件中找到(http://www.open-std.org/jtc1/sc22/wg14/ www/C99RationaleV5.10.pdf),那麼這個問題可能是不應該回答的...... –
我想你會發現'typedef'之前的'struct tag'已經過去了幾年,然後就是向下兼容。 C++確實按你的意思做了。嘗試追捕'原始C'。我有一個tar文件'v6root.tar',其中包含有大量'struct'的源文件,但其中包含一個'typedef'。那應該是Unix V6的源代碼。 Unix V7有'typedef'。 –
最明顯的原因是,僅僅使用'struct'和'union',語言仍然是上下文無關的 - 直到後來增加'typedef',C語言才需要上下文敏感的解析器。 – caf