2012-02-29 113 views
3

我寫了下面的程序:爲什麼這個C代碼編譯? C結構typdef

typedef struct blahblah { 
    int x; 
    int y; 
} Coordinate; 

int main() { 
    Coordinate p1; 
    p1.x = 1; 
    p1.y = 2; 

    //blah blah has not been declared as a struct, so why is it letting me do this? 
    struct blahblah p2; 
    p2.x = 5; 
    p2.y = 6; 
} 

任何人都可以向我解釋這是怎麼回事?

+5

我不太明白。 'struct blahblah'當然*已經被聲明爲一個結構體,它就在你的例子的頂部。 – 2012-02-29 05:18:26

回答

10

你說:

等等等等還沒有被宣佈爲一個結構,

其實,它具有:

typedef struct blahblah { 
    int x; 
    int y; 
} Coordinate; 

這既是一個typedef Coordinate,和定義爲struct blahblah。什麼定義說的是:

  • 定義的數據類型,稱爲struct blahblah
  • 它有兩個成員,int xint y
  • 此外,還要叫Coordinate類型定義,它等效於struct blahblah
0

你宣佈blahblah在你的typedef一個結構。 typedef只是簡單的引用struct blahblah的方法。但是struct blahblah存在,這就是爲什麼你可以給它一個typedef。

2

你的struct聲明等效於

struct blahblah { 
    int x; 
    int y; 
}; 
typedef struct blahblah Coordinate; 

因爲這會爲結構類型(struct blahblah)和Coordinate兩個名字,兩種類型名稱是允許的聲明變量。

2

typedef定義了一個新的用戶定義數據類型,但不會使舊定義無效。例如,typedef int INT不會使int無效。同樣,你的blahblah仍然是一個有效的定義結構!座標只是一種新的類型!

0

typedef用於將一種類型的別名創建爲另一種類型。你實際上在typedef本身中聲明瞭'struct blahblah'。這有點令人困惑,但@蒂莫西和其他人注意到這是一個有效的定義。