欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

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

本篇內(nèi)容介紹了“C語言泛型編程如何實(shí)現(xiàn)”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

成都創(chuàng)新互聯(lián)公司專注于西烏珠穆沁企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),商城網(wǎng)站開發(fā)。西烏珠穆沁網(wǎng)站建設(shè)公司,為西烏珠穆沁等地區(qū)提供建站服務(wù)。全流程按需定制網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

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

#include <iostream> template <class T> T add(T a,T b){   T ret = a + b;   std::cout<< a << " + " << b <<" = " << ret << std::endl;   return ret; } int main(){   add(1,2);  // 整數(shù)相加   add(1.2,2.3); // 浮點(diǎn)數(shù)相加   return 0; }

運(yùn)行結(jié)果:

1 + 2 = 3 1.2 + 2.3 = 3.5

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

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

C語言支持泛型編程嗎?

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

_Generic關(guān)鍵字

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

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

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

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

#include <stdio.h> #define TYPE(v) _Generic((v), \     int:"int", \     char:"char", \     float:"float", \     double:"double", \     char*:"char*", \     default:"other type") int main(void) {     printf("1 + 2 type: %s\n",TYPE(1 + 2));     printf("1/3 type: %s\n",TYPE(1/3));     printf("2/3 type: %s\n",TYPE((float)2/3));     printf("xxx type: %s\n",TYPE("xxx"));     return 0; }

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

運(yùn)行結(jié)果:

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

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

泛型算法

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

#include <stdio.h> // int類型加法 int addI(int a, int b) {     printf("%d + %d = %d\n",a,b, a + b );     return (a + b); } // double類型加法 double addF(double a, double b) {     printf("%f + %f = %f\n",a,b, a + b );     return (a + b); } void unsupport(int a,int b) {     printf("unsupport type\n"); } #define ADD(a,b) _Generic((a), \     int:addI(a,b),\     double:addF(a,b), \     default:unsupport(a,b)) int main(void) {     ADD(1 , 2);     ADD(1.1,2.2);     return 0; }

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

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

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

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

C99的tgmath.h

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

#include <stdio.h> #include <tgmath.h> int main(void) {     float f = 4.0f;     long double d = 1.44;     printf("%f\n",sqrt(f)); // 實(shí)際上調(diào)用了sqrtf     printf("%Lf\n",sqrt(d)); // 實(shí)際上調(diào)用了sqrtl     return 0; }

編譯運(yùn)行結(jié)果:

2.000000 1.200000

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

void *指針

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

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

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

“C語言泛型編程如何實(shí)現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

網(wǎng)站標(biāo)題:C語言泛型編程如何實(shí)現(xiàn)
新聞來源:http://aaarwkj.com/article42/pegjhc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站企業(yè)建站、營銷型網(wǎng)站建設(shè)搜索引擎優(yōu)化、靜態(tài)網(wǎng)站、App設(shè)計(jì)

廣告

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

搜索引擎優(yōu)化
亚洲欧美日韩国产亚洲欧美日韩国产 | 亚洲国产成人久久综合区| 人妻少妇亚洲中文字幕| 日本在线看片一区二区| 亚洲一区二区三区 码| 国产精品一区二区黑人巨大| 97视频精品在线播放| 亚州无吗一区二区三区| 熟女精品国产一区二区三区| 中文字幕av免费专区| 91在线免费观看日本| 日韩不卡永久免费视频观看| 日韩熟女av中文字幕| 精品国产一区二区av麻豆| 森泽佳奈在线视频观看| 亚洲av成人一区二区三区| 色综合一区二区日本韩国亚洲| 中文字幕精品免费日韩在线| 亚洲国产精品一区一区| 国产激情久久久久久影院| 日韩有码大片最新自拍| 亚洲日本韩国福利久久| 欧美国产精品一区二区免费| 久久精品国产亚洲av高清综合 | 亚洲色图熟女激情另类| 麻豆精东传媒一区二区| 国产视频一区二区麻豆| 欧美日韩亚洲国产精品视频| 亚洲午夜天堂在线a毛片| 天天操天天射夜夜爽| 亚洲男人的天堂久久精品| 中文字幕人妻丝袜一区一三区| 中文字幕国产精品综合| 18禁在线免费观看网站| 亚洲国产精品热久久网站| 欧美日本国产在线一区二区| 少妇被啪出水在线视频| 麻豆av永久地址久久精品| 日韩不卡在线观看免费 | 91国产自拍在线视频| 国产精品人成在线观看不卡|