2012-04-29 41 views
8

在C++中,您可以通過使用模板來同時使用泛型和類型安全容器。然而在C中,如果你想要通用容器,你必須(afaik)使用void*,這意味着你會失去類型安全。要有類型安全的容器,你將不得不重新實現他們對於你想要保存的每種類型的數據。在C,通用容器還是安全容器?

鑑於c跟更的程序員知道的什麼-he's-做理念比C++,你會在C做的更地道的事情:使用通用集裝箱,void*,或使自定義容器每種類型的數據?

回答

3

我願意爲通用集裝箱宗旨:

  1. 一旦你習慣了它,你就覺得void *是意義的東西的類型時,我不關心它的類型。這就像Java中的Object--在很長一段時間裏,通用容器也沒有類型安全。

  2. 您只有一個地方可以進行改進。

  3. 你沒有得到類型安全;但是通過重複執行類型安全的容器,可能會出現複製和粘貼錯誤的風險。這也可能導致錯誤。

0

爲了使這樣一種類型,處理用C通用數據你可以使用一個void*是傳遞數據。爲每種可能的類型定義新的算法是不切實際的。

+0

嗯,你只會定義您需要的算法。但我明白你在說什麼。 – 2012-04-29 05:40:22

+0

@PaulManta:是的,我正在處理應該處理任意類型的容器示例。 – 2012-04-29 19:03:34

0

你沒有真正的好處是用void*作爲成員(除非,比如說,編譯時間是最重要的),你可以隨時轉換爲void*在適當情況下,然後在非類型化數據的斑點操作必要。

我已經在C中實現了這樣的接口(例如具有不同類型的命名字段的多個變體)。我喜歡類型安全,並且很少在這些實現中發現鑄造到void*好東西。

......還是那句話,我花更多的時間來編寫C++比C :)

0

所以我有一個快速搜索,看看是否有新的巧妙構思出現了用C容器領域。我發現this。這是一個完整的C容器庫的徹底嘗試。

它通過元件周圍將被包含在void *指針。沒有試圖指定特定類型的結構。

類型安全,你可以寫爲每個容器「包裝」的宏,如果內聯函數,圍繞非類型化的版本,包裝和提供的類型安全定義的主機。希望他們會被編譯器優化掉,但這並不總是可能的。宏將是醜陋

我想這也是爲什麼更多的(應用)程序是用C++而不是C.在C創建複雜抽取的能力是有限的原因之一。你可以這樣做,但你通常會犧牲性能或可維護性等其他方面(例如查看一個C GTK程序)。

+0

隨着C11的新'_Generic'關鍵字,這些宏musn't太醜陋,其實。 Clang已經實現了這一點,而gcc也有足夠的功能來模擬它。 – 2012-04-29 08:28:50