2011-07-25 59 views
0
typedef struct hash_table_data 
{ 
    int key; 
    int data; 
    struct hash_table_data* next; 
    struct hash_table_data* prev; 
}hash_table_data; 

typedef struct hash_table 
{ 
    int num_entries; 
    struct hash_table **entries; 
}hash_table; 

VERSUSC - 這兩個結構聲明有什麼區別?

struct hash_table_data_ 
{ 
    int key,data; 
    struct hash_table_data_ *next,*prev; 
}; 
typedef struct hash_table_data_ hash_table_data; 

struct hash_table_ 
{ 
    int num_entries; 
    struct hash_table_data_ **entries; 
}; 
typedef struct hash_table_ hash_table; 
+0

這功課嗎? – Suroot

+0

是不是第一個更好的風格? –

+0

在我看來(這是爭論)後一個例子是更好的風格;因爲它不會將結構定義與typedef混合在一起。但是,有很多人覺得其他方面同樣強烈。修改或擴展其他代碼時最好拋棄這些意見。做他們做的事。當從頭開始編寫自己的新代碼時,這是唯一適合對這樣的話題發表看法的時候。 –

回答

2

在第二個例子中,你必須在行動的額外名稱:struct hash_table_data_struct hash_table_

在第一個例子,您可以有效地與重命名struct hash_table_data較短hash_table_data一個typedef隱藏名稱struct hash_table_data

你可以把它像這樣:

typedef (something that happens to be struct X) (to) X 

VS

define a struct X 
typedef struct X (to) X 

現在,在後者的例子,你其實並不做前者的例子做什麼。在後面的例子中,你做

define a struct X_ 
typedef struct X_ (to) X 

這裏的關鍵是你有一個「額外的」結構X_可以直接使用。

+0

他在兩個名字都有。他必須將第一個示例更改爲'typedef struct {...'from typedef struct hash_table_data {...'沒有'struct hash_table_data'可用的名稱 { – Paulpro

+0

他們是否實現完全相同的目標?如果我使用一個與另一個,會有區別嗎? –

+0

啊,所以我有一些冗餘......我可以刪除第一個typedef結構hash_table_data或後面的括號中的hash_table_data ...? –

0

他們只是兩種不同的方法具有相同的結果結束了。

0

第一個更短。除此之外,它們是相同的。

2

實際上沒有任何。 (已刪除的鏈接,因爲有些人無法讀取上下文。)

1

唯一的區別在於,在第一個示例中,結構的標記名稱與typedef名稱相同,在第二個示例中它們略有不同(他們有一個尾隨下劃線)。

由於struct標記名稱位於不同的名稱空間中,因此不需要typedef名稱不同(或相同)。有關其他詳細信息,請參閱C style struct declaration

作爲一種風格,我更喜歡我的成員聲明是一行代碼(如第一個示例中那樣),但這絕對是一種風格偏好;對結構沒有任何影響。