2012-01-18 34 views

回答

9

它定義了兩個類型定義,如:

typedef struct work_tag { 
    //contents. 
} work_t; 

typedef struct work_tag *work_p; 
1

它分配兩個備選名稱現有類型:

work_t -> struct work_tag 
work_p -> struct work_tag * 
+0

它沒有定義新的類型;它爲現有類型定義新名稱。 – 2012-01-18 23:16:55

+0

@KeithThompson你說得對。爲了避免混淆,我更新了答案。感謝您的反饋意見。 – jcollado 2012-01-18 23:22:51

2

一個typedef像一個變量聲明的思考。就像你可以做int a, b來創建兩個int變量一樣,你可以做typedef int a_t, b_t在一個typedef中做兩種類型。

3

正如其他答案所說,它定義了兩個typedefs,一個名爲work_t,指的是struct work_tag,另一個名稱是work_p,指的是struct work_tag*

請注意,typedef不會創建新類型。它所做的就是爲現有類型創建一個別名struct work_tagwork_t不是兩個相似的類型,它們是的兩個名字,正好是的同一類型。

現在讓我們來討論一下你爲什麼要這樣做。

struct work_tagstruct work_tag*類型已經有完美的名字。 A typedef爲您提供了一種使用單一標識符來引用這些類型的方法,但在我看來,這並沒有太大的優勢。而指針類型的typedef實際上可能有點危險。如果你想爲一個真正不透明的類型定義一個名字,那麼使用它的代碼並沒有利用它是一個結構或指針的事實,typedef是一個很好的解決方案;否則,你只是在遮掩重要的信息。

我只是寫:

struct work { 
    // contents 
}; 

,然後參考類型struct work,和一個指針類型struct work*

但如果你真的覺得需要有一個字的名稱類型,沒有必要爲標籤和類型定義使用不同的名稱:

typedef struct work { 
    // contents 
} work; 

現在,您可以參考類型如struct workwork,指針類型爲struct work*work*。 (C++會隱式地執行; C不會)。請注意,如果struct work包含指向另一個struct work的指針,則不能在定義內使用typedef名稱; typedef名稱在定義結束之前不可見。