2013-03-25 85 views
5

我很好奇C中這種行爲的動機是故意還是意外?爲什麼結構標籤不是C中的類型名稱?

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

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

我想知道爲什麼裏奇或標準委員會選擇了這種行爲。

+1

丹尼斯·裏奇不太可能回答你的問題......如果答案不在理由文件中找到(http://www.open-std.org/jtc1/sc22/wg14/ www/C99RationaleV5.10.pdf),那麼這個問題可能是不應該回答的...... –

+0

我想你會發現'typedef'之前的'struct tag'已經過去了幾年,然後就是向下兼容。 C++確實按你的意思做了。嘗試追捕'原始C'。我有一個tar文件'v6root.tar',其中包含有大量'struct'的源文件,但其中包含一個'typedef'。那應該是Unix V6的源代碼。 Unix V7有'typedef'。 –

+0

最明顯的原因是,僅僅使用'struct'和'union',語言仍然是上下文無關的 - 直到後來增加'typedef',C語言才需要上下文敏感的解析器。 – caf

回答

4

這是一個命名空間的事情。這樣,我可以有struct a,enum a,union a,它們都不含糊。它有助於設計可能具有相似類型名稱的框架,但它可能會快速混淆。

+0

但我想知道爲什麼標準委員會或Dennis Ritchie選擇了這種行爲。 – Rayniery

+1

這當然是對的,但我不知道這是確切的答案,還是Kernighan和Ritchie作出決定背後的原始推理。 –

+1

@Rayniery我們都不是他們 - 我們不能告訴你他們在設計語言時想的是什麼。我們只能推測,投機決不會導致任何好事。 –

0

在閱讀The Development of the C Language,當丹尼斯里奇討論胚胎Ç他描述了他的意圖爲struct

我想要的結構不僅是表徵一個抽象的對象,但也描述位的集合可能會從目錄中讀取。

該部分主要討論這個想法如何導致「陣列< - >指針等價」的引入。然而,它確實與C的低級特性有關(struct代表「比特集合」)。

相比之下,C++使用struct作爲class的一種同義詞,但一切都是公開的。 A class實際上是面向對象編程中的一個概念,其標籤被視爲一種類型更爲自然。

相關問題