我理解C語言中定義結構的整個類型,以便您可以避免在使用關鍵字struct時使用它。儘管如此,我仍然對這裏發生的一切感到困惑。這個語法究竟做了什麼? (關於C風格的結構)
有人能告訴我這個結構定義正在做的各種事情嗎?
typedef struct work_tag {
//contents.
} work_t, *work_p;
我理解C語言中定義結構的整個類型,以便您可以避免在使用關鍵字struct時使用它。儘管如此,我仍然對這裏發生的一切感到困惑。這個語法究竟做了什麼? (關於C風格的結構)
有人能告訴我這個結構定義正在做的各種事情嗎?
typedef struct work_tag {
//contents.
} work_t, *work_p;
它定義了兩個類型定義,如:
typedef struct work_tag {
//contents.
} work_t;
typedef struct work_tag *work_p;
它分配兩個備選名稱現有類型:
work_t -> struct work_tag
work_p -> struct work_tag *
一個typedef
像一個變量聲明的思考。就像你可以做int a, b
來創建兩個int
變量一樣,你可以做typedef int a_t, b_t
在一個typedef
中做兩種類型。
正如其他答案所說,它定義了兩個typedefs,一個名爲work_t
,指的是struct work_tag
,另一個名稱是work_p
,指的是struct work_tag*
。
請注意,typedef
不會創建新類型。它所做的就是爲現有類型創建一個別名。 struct work_tag
和work_t
不是兩個相似的類型,它們是的兩個名字,正好是的同一類型。
現在讓我們來討論一下你爲什麼要這樣做。
struct work_tag
和struct work_tag*
類型已經有完美的名字。 A typedef
爲您提供了一種使用單一標識符來引用這些類型的方法,但在我看來,這並沒有太大的優勢。而指針類型的typedef
實際上可能有點危險。如果你想爲一個真正不透明的類型定義一個名字,那麼使用它的代碼並沒有利用它是一個結構或指針的事實,typedef
是一個很好的解決方案;否則,你只是在遮掩重要的信息。
我只是寫:
struct work {
// contents
};
,然後參考類型struct work
,和一個指針類型struct work*
。
但如果你真的覺得需要有一個字的名稱類型,沒有必要爲標籤和類型定義使用不同的名稱:
typedef struct work {
// contents
} work;
現在,您可以參考類型如struct work
或work
,指針類型爲struct work*
或work*
。 (C++會隱式地執行; C不會)。請注意,如果struct work
包含指向另一個struct work
的指針,則不能在定義內使用typedef名稱; typedef名稱在定義結束之前不可見。
它沒有定義新的類型;它爲現有類型定義新名稱。 – 2012-01-18 23:16:55
@KeithThompson你說得對。爲了避免混淆,我更新了答案。感謝您的反饋意見。 – jcollado 2012-01-18 23:22:51