2014-05-04 129 views
0

我有兩個具有相同結構的物理實體。什麼是處理這種情況的理想方式。在兩個結構體具有固有相同結構的情況下消除一個結構體定義

例如:

struct graphlet_vector { 
    int a; 
    int* data; 
} 

struct group_vector { 
    int a; 
    int *data; 
} 

組矢量被定義爲在一定範圍內,因此該結構結合到保留在所述時間段相同的聚合基元向量。因此,對同一事物有兩種結構似乎是多餘的。

我不能用這樣的東西: typedef struct graphlet_vec struct group_vec(雖然以下工作正常:typedef struct graphlet_vec group_vec)。

有什麼建議嗎?

+0

是否必須保持struct關鍵字?我沒有看到任何問題,否則 –

+0

@EsaLakaniemi只是一個隨處可見的約定。有興趣知道是否有其他方法來執行它。 –

+1

如果這兩件事在概念上或語義上不同,請將它們分開,並且不要擔心「冗餘」。如果您需要表示兩種複合類型,則將它們表示爲兩種不同的類型。他們擁有相同內部表現的事實與這個決定並不緊密。你的問題表明你想繼續*使用*兩個不同的名字,所以省去在標題中輸入兩個小'struct'定義的麻煩是微不足道的。無論如何,編譯後的'struct'定義將會消失,所以你不會保存任何實際的資源。 –

回答

0

如果你真的希望他們是同一類型,可以使用兩種類型定義:

struct g_vector { /* ... */ }; 
typedef struct g_vector graph_vector; 
typedef struct g_vector group_vector; 

如果你喜歡引用類型爲struct graph_vectorstruct group_vector而不是僅僅通過對每個單一的標識符,有沒有真正的清潔辦法做到這一點(struct foostruct bar總是不同的類型) - 但你可以使用預處理:

struct g_vector { /* ... */ }; 
#define graph_vector g_vector 
#define group_vector g_vector 

另手,你應該考慮你是否真的想讓它們成爲同一類型。他們有不同的名字,所以他們顯然對你有不同的含義;否則你會定義一個單一的類型。是否會有可以在任何類型的對象上運行的代碼?如果不是,請保持截然不同。

如果您想在某些情況下將它們視爲不同的類型,但在其他情況下將它們視爲不同的類型,那有點棘手。您可以將它們定義爲相同的類型,並注意不要在希望它們不同的情況下混淆操作(因此會丟失一些編譯時類型檢查)。或者您可以將它們定義爲不同類型,並使用void*來實現常用功能。 (或者您可以從C切換到C++並使用類繼承從共同的父類型派生它們。)

相關問題