成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

C語言中如何實現(xiàn)泛型編程

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

創(chuàng)新互聯(lián)于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站設(shè)計、網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元富錦做網(wǎng)站,已為上家服務(wù),為富錦各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792

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

運行結(jié)果:

1 + 2 = 3 1.2 + 2.3 = 3.5

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

你同樣可以使用重載實現(xiàn)上面的功能,但是存在大量重復(fù)代碼。

C語言支持泛型編程嗎?

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

_Generic關(guān)鍵字

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

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

什么意思呢?如果value是int類型,那么表達式的值就是“int”,其他的以此類推??雌饋硎遣皇呛蛃witch語句有點類似呢?

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

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

運行結(jié)果:

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

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

泛型算法

既然C語言有_Generic關(guān)鍵字了,那么我們嘗試實現(xiàn)開頭C++示例代碼中的加法??催^上面的例子后,相信你已經(jīng)會了:

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

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

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

  • 調(diào)用者無需區(qū)分被加對象是什么類型,都可以統(tǒng)一使用ADD

C99的tgmath.h

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

編譯運行結(jié)果:

2.000000 1.200000

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

void *指針

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

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

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

以上就是“C語言中如何實現(xiàn)泛型編程”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習更多的知識,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站標題:C語言中如何實現(xiàn)泛型編程
路徑分享:http://jinyejixie.com/article34/gpespe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、網(wǎng)站營銷、網(wǎng)站排名響應(yīng)式網(wǎng)站、網(wǎng)站設(shè)計、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
盐城市| 吉安县| 临泽县| 梧州市| 台中市| 肇州县| 巴林右旗| 和田市| 林西县| 定南县| 三亚市| 白山市| 新绛县| 青河县| 册亨县| 册亨县| 常宁市| 宝清县| 石狮市| 苏尼特右旗| 咸宁市| 金寨县| 香港| 水富县| 商丘市| 瑞安市| 丹棱县| 东阿县| 平凉市| 绥芬河市| 加查县| 静安区| 祁阳县| 纳雍县| 微博| 七台河市| 双牌县| 普兰县| 固安县| 大兴区| 巍山|