[英]Why using a typedef *after* struct definition?
這兩種風格:
struct _something
{
...
};
typedef struct _something someting;
那種風格:
typedef struct _something
{
...
} something;
是C中正確的typedef聲明
請注意, 頭文件中存在結構聲明是有目的的:我需要訪問其他地方的結構的內部組件。
第一個聲明的一個缺點是當你使用任何IDE時,自動“跳轉到聲明”通常會引導你進入typedef struct _something someting;
而不是直接給你真正的結構定義。
在第二種方法中,您可以直接進入結構定義。
是否有人會使用第一種方法?
我正在處理的代碼充滿了這些......
它只是維護者的壞/好習慣嗎?
分離typedef和struct聲明有一個明顯的優點,如果你在不同的文件中將兩者分開,那么這種優勢很明顯。 它允許數據封裝。
你在頭文件中聲明了你的
typedef struct whatever typename;
這是一種struct whatever
類型的聲明,不知道它是如何實現的。 您現在可以聲明屬於該接口的函數,而不會從結構的內部顯示任何內容。 傳遞指向該typename
名稱的指針就是所需要的。
在你的“類”的實現文件中(我把它放在引號中,因為我們在這里純粹是在C語境中討論),你這樣做:
#include "header.h"
struct whatever {
...
...
/* can even contain references to `struct whatever` or even `typename` */
};
這種封裝的優點是您可以更改內部結構,而無需重新編譯應用程序的其余部分。 如果您使用動態庫,可以派上用場。
此討論主題提供了對主題的良好概述,並突出顯示使用第一個樣式的重要原因:
這種樣式將類型定義( 不是 typedef所做的)與typename同義詞創建(這是 typedef所做的)分開,並保留了類型名稱和類型同義詞之間的強相關性,而沒有為兩者使用相同名稱的缺點(這可能會混淆)一些調試器,無論如何都是grep的痛苦)。
沒有技術上的理由可以選擇兩種類型的結構。
有些人可能使用第一種方法,因為他們分別學習了typedef和結構聲明,而他們只是沒有組合它們。 或許他們的IDE更喜歡另一種形式。
或者在強大的IDE可用之前,可能會有一種奇思妙想的編碼風格。
如果將兩個東西(typedef與struct聲明)分開,則可以根據需要使用不透明的指針 。
將不透明指針視為在特定結構中封裝信息的原始方式,而不讓用戶訪問內部信息。
另請閱讀@ tristopia的回答。
定義結構時:
struct something
{
...
};
您已經創建了一個名為“struct something”的新類型。
你可以在你的應用程序中使用這個:
struct something myvar;
但大多數人不喜歡輸入struct(特別是有很多指針):
struct something *test = (struct something*)malloc(sizeof(struct something))
所以你可以輸入它(以你描述的任何一種方式):
struct something
{
...
};
typedef struct _something someting;
要么
typedef struct _something
{
...
} something;
這樣,當您使用結構時,您可以這樣做:
something *test = (something*)malloc(sizeof(something))
至於你定義它的方式,它並不重要。
有些人喜歡將所有的typedef放在一個頭文件中,這樣他們就可以輸入構造結構,指向結構的指針等。
有時您可能想為單一類型創建多個同義詞。 在這種情況下,您最好使用第一種方法,因為這會在一個地方為您提供所有同義詞,即typedef。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.