簡體   English   中英

為什么在* struct定義之后使用typedef *?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM