訪問檢查
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。
來源
2016-01-16 23:24:56
Kaz
我認爲使用這個聯盟將是首選的方式。 – Linus
_professional_ library ...相對於什麼? – ryyker
我認爲工會很少是'結構'。他們在標準庫中使用聯合? –