2016-01-16 106 views
1

我想用C編寫一個庫,我不知道推薦的方法是什麼。我得到了例如結構和多種功能如下:C結構多種類型

typedef struct example 
{ 
    int *val; 
    struct example *next; 
} Example; 

,我必須建立功能多種類型的VAL

Example* build() { do sth }; 
Example* buildf() { do sth }; // val is float 
Example* buildd() { do sth }; // val is double 

什麼是更好的做法(中使用的「專業」庫) 。使用指針來void和cast或具有所有可能性的結構 - int,float,double。

+5

我認爲使用這個聯盟將是首選的方式。 – Linus

+0

_professional_ library ...相對於什麼? – ryyker

+0

我認爲工會很少是'結構'。他們在標準庫中使用聯合? –

回答

2

使用union和某種方式來存儲類型信息:

typedef struct example 
{ 
    enum{ T_STRUCT_WITH_INT, T_STRUCT_WITH_FLOAT, T_SO_ON } type; 
    union { 
     int val_int; 
     float val_float; 
    } val; 
    struct example *next; 
} Example; 

接入領域的s->val.val_int

在C11,你可以有工會匿名和領域可以像s->val_int

+0

但我需要指針。也許更好的方法是使用void * –

+0

如果可能的類型是有限的 - 在struct結構中有指針,這種類型安全性不僅僅是在內存和性能方面投入空白和相同 – Vasfed

+0

我感謝您的幫助和感謝! –

1
訪問檢查 type

這主要基於一些意見,經驗和具體要求的結合。

以下方法是可能的,受Jacob Navia的一些容器庫工作的啓發。我從來沒有使用過它自己:

struct container_node { 
    struct container_node *link_here, *link_there, *link_elsewhere; 
    /*...*/ 
    char data[0]; /* C90 style of "flexible array member" */ 
}; 

struct container_node *container_node_alloc(size_t data_size); 

分配函數分配足夠大,以便data[0]通過data[data_size-1]字節的存儲空間可用的節點。通過另一組API函數,可以將任意類型的用戶數據複製進出。

以下方法有時稱爲「侵入性容器」。容器只定義了一個由鏈接結構組成的「基類」。用戶必須嵌入這個結構導入到自己的結構:

struct container_node { 
    struct container_node *next, *prev; 
}; 

void container_insert(struct container *container, struct container_node *n); 

struct container_node *container_first(struct container *container); 

用戶做到這一點:

struct my_widget { 
    struct container_node container_links; 
    int widget_height; 
    /* ... */ 
}; 

/* .... */ 

/* We don't insert my_widget, but rather its links base. */ 
container_insert(&widg_container, &widget->container_links); 

某些宏使用的指針到窗口小部件和一個指向容器環節之間的轉換。見在Linux內核中廣泛使用的container_of宏:

struct my_widget *wptr = container_of(container_first(&widg_container), 
             struct my_widget, container_links); 

this question

然後在每個節點中存儲union的方法,該節點提供整數,浮點值或指針。在這種情況下,數據是分開分配的(儘管不一定:如果調用者控制節點的分配,仍然可以將節點結構和用戶數據放在來自單個調用的緩衝區中)。

最後,還有一些方法將這些技術與預處理器模板打包在一起,其中一個例子是BSD QUEUE macros