C語言泛型選擇編程示例詳解
前言
相比C++模板, C語言進行泛型編程沒有天然優(yōu)勢, 但并不意味著不能打.
自C11起, C語言已經(jīng)提供泛型選擇功能, 也就是通過系統(tǒng)特性, 不那么順暢, 但是也勉強可以做一定的泛型了.
同時由于void*的類型抹除性質(zhì), 可以做類似C++標準庫泛型算法的偽泛型函數(shù).
一、_Generic關鍵字
_Generic是C11的新特性, 它能根據(jù)變量類型, 選擇要執(zhí)行的表達式,
_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ì)上這種泛型沒有減少代碼量, 也不夠自動, 簡單代碼好說, 復雜代碼就比較麻煩了.
二、類型抹除偽泛型
最為典型的是C標準庫的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ù).
總結
現(xiàn)在不能說C語言沒有泛型功能了,只不過和C++相比, 還是有點繁瑣, 困難, 難以debug, 但以C的性格, 能加入這種特性, 已經(jīng)是很給面子了.
以上就是C語言泛型選擇編程示例詳解的詳細內(nèi)容,更多關于C語言泛型選擇的資料請關注腳本之家其它相關文章!
相關文章
C 創(chuàng)建鏈表并將信息存儲在二進制文件中讀取的實例代碼
C 創(chuàng)建鏈表并將信息存儲在二進制文件中讀取的實例代碼,需要的朋友可以參考一下2013-03-03
C語言編寫基于TCP和UDP協(xié)議的Socket通信程序示例
這篇文章主要介紹了C語言編寫基于TCP和UDP協(xié)議的Socket通信程序示例,其中TCP的客戶端與服務器端采用多線程實現(xiàn),需要的朋友可以參考下2016-03-03
C語言中的pause()函數(shù)和alarm()函數(shù)以及sleep()函數(shù)
這篇文章主要介紹了C語言中的pause()函數(shù)和alarm()函數(shù)以及sleep()函數(shù),是C語言入門學習中的基礎知識,需要的朋友可以參考下2015-09-09

