C語(yǔ)言泛型選擇編程示例詳解
前言
相比C++模板, C語(yǔ)言進(jìn)行泛型編程沒(méi)有天然優(yōu)勢(shì), 但并不意味著不能打.
自C11起, C語(yǔ)言已經(jīng)提供泛型選擇功能, 也就是通過(guò)系統(tǒng)特性, 不那么順暢, 但是也勉強(qiáng)可以做一定的泛型了.
同時(shí)由于void*
的類型抹除性質(zhì), 可以做類似C++標(biāo)準(zhǔn)庫(kù)泛型算法的偽泛型函數(shù).
一、_Generic關(guān)鍵字
_Generic
是C11的新特性, 它能根據(jù)變量類型, 選擇要執(zhí)行的表達(dá)式,
_Generic(expression, type1: code block1, type2: code block2, ..., default: code blockn)
比如最簡(jiǎn)單的, 打印一個(gè)可能是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ì)上這種泛型沒(méi)有減少代碼量, 也不夠自動(dòng), 簡(jiǎn)單代碼好說(shuō), 復(fù)雜代碼就比較麻煩了.
二、類型抹除偽泛型
最為典型的是C標(biāo)準(zhǔn)庫(kù)的qsort()
函數(shù), 通過(guò)將數(shù)組類型抹除為void*
, 可以傳入任何類型數(shù)組, 通過(guò)特定的比較函數(shù), 確定類型, 實(shí)現(xiàn)泛型功能.
qsort(void *Base, // 數(shù)組地址 size_t NumOfElements, // 元素?cái)?shù)量 size_t SizeOfElements, // 元素大小 int (*PtFuncCompare)(const void *, const void *) // 比較函數(shù) );
這個(gè)用_Generic恐怕就會(huì)非常繁瑣了, 雖然可以少一個(gè)元素大小的參數(shù).
總結(jié)
現(xiàn)在不能說(shuō)C語(yǔ)言沒(méi)有泛型功能了,只不過(guò)和C++相比, 還是有點(diǎn)繁瑣, 困難, 難以debug, 但以C的性格, 能加入這種特性, 已經(jīng)是很給面子了.
以上就是C語(yǔ)言泛型選擇編程示例詳解的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言泛型選擇的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++可視化角色按鍵移動(dòng)控制的實(shí)現(xiàn)
這篇文章主要介紹了C++可視化角色按鍵移動(dòng)控制的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2020-03-03VS+Qt+Halcon 顯示圖片,實(shí)現(xiàn)鼠標(biāo)縮放、移動(dòng)圖片
本篇博文記錄一下,用VS+Qt+Halcon實(shí)現(xiàn)對(duì)圖片的讀取以及鼠標(biāo)縮放,移動(dòng)(鼠標(biāo)事件調(diào)用了halcon自帶的算子)的過(guò)程。感興趣的可以了解一下2021-08-08floyd算法實(shí)現(xiàn)思路及實(shí)例代碼
這篇文章主要介紹了floyd算法實(shí)現(xiàn)思路及實(shí)例代碼,有需要的朋友可以參考一下2014-01-01解決C語(yǔ)言數(shù)組元素循環(huán)右移的問(wèn)題
今天小編就為大家分享一篇解決C語(yǔ)言數(shù)組元素循環(huán)右移的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07C語(yǔ)言進(jìn)階幾分鐘帶你理解大小端存儲(chǔ)模式
這篇文章主要為大家介紹了C語(yǔ)言進(jìn)階大小端模式的示例詳解,帶各位讀者朋友五分鐘腳踩大小端模式,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-02-02C語(yǔ)言編程動(dòng)態(tài)內(nèi)存分配常見錯(cuò)誤全面分析
這篇文章主要介紹了C語(yǔ)言編程中動(dòng)態(tài)內(nèi)存分配的常見錯(cuò)誤全面分析講解,同樣遇到過(guò)C語(yǔ)言動(dòng)態(tài)內(nèi)存分配各種問(wèn)題的同學(xué)可以借鑒參考下,希望能夠有所幫助2021-10-10C語(yǔ)言實(shí)現(xiàn)打印星號(hào)圖案
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)打印星號(hào)圖案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11OpenGL實(shí)現(xiàn)不規(guī)則區(qū)域填充算法
這篇文章主要為大家詳細(xì)介紹了OpenGL實(shí)現(xiàn)不規(guī)則區(qū)域填充算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02