天天看點

11.C語言泛型的支援

在前面我所編寫的jwarray和jwlist都是隻能寫定一種類型,那麼為了在實際中使用友善,很自然想到類似c++中的泛型支援功能,c++中使用模闆技術來實作泛型,但是在c中是不支援模闆技術的,怎麼來實作泛型呢?

如果你了解一點c++的模闆技術的話,就知道其實這裡的c++模闆技術最簡單的實作就是編譯器對每一種類型都實作一次,然後調用的時候連結到不同類型的實作。那麼既然這裡c語言編譯器本身不支援模闆技術,那麼我們就用手工來實作每一種類型的函數,然後在實際調用的時候直接連結到對應類型的函數即可。

最簡單的c語言泛型實作如下

這裡我們編寫一個int類型的maxcount_int函數和一個double類型的maxcount_double函數

在實際調用的時候用maxcount(type)宏來完成連結到不同類型的實作上

注意這裡##的用法,這是比較偏僻的c語言文法,就是把##後的内容粘貼到##前内容後

實際的jwarray的泛型定義如下

實際的jwlist泛型定義如下

這裡的jwarray和jwlist最基本的都支援double、float、char、int類型的支援,支援自定義類型。

對于jwlist,實作自定義類型時,首先更改jwlistelem定義,然後複制一個已有的類型如int的檔案,替換_int即可。要注意jwlistprintfelem、jwlistdump、jwlist_comparefunc、jwlist_traversefunc的細微變化。jwarray類似。

c語言的另一種泛型的實作是使用void *指針,但是這樣做必須在函數參數中顯式的傳遞一個類型參數,使用不友善,具體實作請自行百度。

加入泛型的jwarray和jwlist的完整源代碼

原創,轉載請注明來自

繼續閱讀