C語言泛型選擇編程示例詳解
前言
相比C++模板, C語言進(jìn)行泛型編程沒有天然優(yōu)勢, 但并不意味著不能打.
自C11起, C語言已經(jīng)提供泛型選擇功能, 也就是通過系統(tǒng)特性, 不那么順暢, 但是也勉強可以做一定的泛型了.
同時由于void*
的類型抹除性質(zhì), 可以做類似C++標(biāo)準(zhǔn)庫泛型算法的偽泛型函數(shù).
一、_Generic關(guān)鍵字
_Generic
是C11的新特性, 它能根據(jù)變量類型, 選擇要執(zhí)行的表達(dá)式,
_Generic(expression, type1: code block1, type2: code block2, ..., default: code blockn)
比如最簡單的, 打印一個可能是int
, 也可能是float
的值:
#include <stdio.h> #define print(f) \ if (_Generic(f, int: 0, float: 1)) \ { \ printf("float = %f\n", f); \ } \ else \ { \ printf("int = %d\n", f); \ } int main() { float f = 5.5F; print(f); int i = 9; print(i); return 0; }
相比C++, 以上代碼需要用宏模擬泛型, 比較令人詬病的是debug比較困難, 而且本質(zhì)上這種泛型沒有減少代碼量, 也不夠自動, 簡單代碼好說, 復(fù)雜代碼就比較麻煩了.
二、類型抹除偽泛型
最為典型的是C標(biāo)準(zhǔn)庫的qsort()
函數(shù), 通過將數(shù)組類型抹除為void*
, 可以傳入任何類型數(shù)組, 通過特定的比較函數(shù), 確定類型, 實現(xiàn)泛型功能.
qsort(void *Base, // 數(shù)組地址 size_t NumOfElements, // 元素數(shù)量 size_t SizeOfElements, // 元素大小 int (*PtFuncCompare)(const void *, const void *) // 比較函數(shù) );
這個用_Generic恐怕就會非常繁瑣了, 雖然可以少一個元素大小的參數(shù).
總結(jié)
現(xiàn)在不能說C語言沒有泛型功能了,只不過和C++相比, 還是有點繁瑣, 困難, 難以debug, 但以C的性格, 能加入這種特性, 已經(jīng)是很給面子了.
以上就是C語言泛型選擇編程示例詳解的詳細(xì)內(nèi)容,更多關(guān)于C語言泛型選擇的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
VS+Qt+Halcon 顯示圖片,實現(xiàn)鼠標(biāo)縮放、移動圖片
本篇博文記錄一下,用VS+Qt+Halcon實現(xiàn)對圖片的讀取以及鼠標(biāo)縮放,移動(鼠標(biāo)事件調(diào)用了halcon自帶的算子)的過程。感興趣的可以了解一下2021-08-08OpenGL實現(xiàn)不規(guī)則區(qū)域填充算法
這篇文章主要為大家詳細(xì)介紹了OpenGL實現(xiàn)不規(guī)則區(qū)域填充算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-02-02