91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言中如何實現泛型編程

發布時間:2022-04-01 17:22:46 來源:億速云 閱讀:333 作者:iii 欄目:編程語言

今天小編給大家分享一下C語言中如何實現泛型編程的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

泛型編程(generic  programming)是程序設計語言的一種風格或范式。泛型允許程序員在強類型程序設計語言中編寫代碼時使用一些以后才指定的類型,在實例化時作為參數指明這些類型。C++支持泛型編程,也就是模板,比如:

運行結果:

1 + 2 = 3 1.2 + 2.3 = 3.5

從上面的結果可以看到,對于調用add函數,如果傳入的是整型,則按照整型加法計算,如果是浮點數,則按照浮點數進行加法計算。也就是說,add函數沒有針對特定類型(泛型)。

你同樣可以使用重載實現上面的功能,但是存在大量重復代碼。

C語言支持泛型編程嗎?

很遺憾,C語言本身不支持真正意義上的泛型編程,但是卻在一定程度上可以“實現泛型編程”。

_Generic關鍵字

_Generic是C11的關鍵字,通過該關鍵字可以有一個泛型表達式:

_Generic((value). int:"int", float:"float",char*:"char*",default:"other type")

什么意思呢?如果value是int類型,那么表達式的值就是“int”,其他的以此類推。看起來是不是和switch語句有點類似呢?

根據這個示例,我們來實現一個功能,打印變量或常量到底是什么類型:

這里為了方便使用,我們通過define關鍵字,將泛型表達式簡化。

運行結果:

1 + 2 type: int 1/3 type: int 2/3 type: float                                                         xxx type: char*

可以看到通過TYPE就可以獲得表達式的結果類型,這對初學者來說,可真是福音了。

泛型算法

既然C語言有_Generic關鍵字了,那么我們嘗試實現開頭C++示例代碼中的加法。看過上面的例子后,相信你已經會了:

觀察上面的代碼,我們注意到:

  • 在這里,我們需要定義兩種類型的加法(實際上,通過C++的模板,由編譯器幫我們完成了這件事),由于C語言中并不支持重載,因此兩個加法的函數名不一樣。

  • 由于涉及參數有兩個,在做類型判斷時,如果兩個參數不一致,可能仍然存在編譯問題

  • 調用者無需區分被加對象是什么類型,都可以統一使用ADD

C99的tgmath.h

前面說到,_Generic關鍵字在C11中才有,那么C99怎么辦呢?實際上,tgmath.h中提供了一些泛型類型宏,如果math.h的函數中定義了float,double和long  double版本,tgmath就會提供一個泛型類型宏。效果和前面的例子一樣,舉個例子:

編譯運行結果:

2.000000 1.200000

但是不得不說,tgmath中提供的泛型宏也是有限的。

void *指針

眾所周知,C語言中void  *指針是一種無類型指針,從這點看,也可以算是泛型指針了。而它的使用在C語言中是非常常見的,舉例來說,快速排序接口的函數聲明是這樣的:

#include <stdlib.h> void qsort(void *base, size_t nmemb, size_t size,                   int (*compar)(const void *, const void *));

庫函數qsort實際上就是泛型排序算法了,它可以針對任何類型的數據進行排序。當然有一個前提,就是你需要按照它的協議,實現一個compar函數,用于比較大小。

以上就是“C語言中如何實現泛型編程”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蓬溪县| 深圳市| 安阳县| 九台市| 柘城县| 长乐市| 临海市| 蓬莱市| 宜昌市| 威信县| 黔东| 西吉县| 平山县| 屏边| 绥德县| 连云港市| 彭阳县| 嵊泗县| 榆社县| 喀喇沁旗| 日照市| 罗城| 高邑县| 西宁市| 隆化县| 堆龙德庆县| 罗定市| 连江县| 峨眉山市| 万盛区| 永吉县| 陕西省| 益阳市| 新巴尔虎左旗| 元朗区| 灵川县| 孟津县| 固原市| 黄冈市| 永胜县| 东至县|