一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語(yǔ)言是否支持泛型編程?

學(xué)益得智能硬件 ? 來(lái)源:學(xué)益得智能硬件 ? 2023-10-16 10:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

C語(yǔ)言是否支持泛型編程?毫無(wú)疑問(wèn),答案是不支持。

什么是泛型編程,我覺(jué)得用C++里面的模板可以很好的說(shuō)明。

#include


//函數(shù)模板
template 
void add(T x, T y)
{
    std::cout << x + y << std::endl;
}


int main()
{
    add(1, 2);
    add(1.11f, 2.22f);


    return 0;
}
比如函數(shù)add就是一個(gè)模板函數(shù),它既能支持整數(shù)的相加,也能支持浮點(diǎn)數(shù)的相加,甚至是其他的自定義類(lèi)型,只要能提供相加的規(guī)則,編譯器都能通過(guò)。

泛型編程可以大大的提高編程的效率。

C語(yǔ)言本身并不支持泛型,好在C11標(biāo)準(zhǔn)后,新增了關(guān)鍵字_Generic,它可以支持輕量級(jí)的泛型編程。

_Generic的作用,如果用一句話(huà)來(lái)描述,就是可以獲得變量的類(lèi)型。

大家可以想一下,在C語(yǔ)言里面,好像確實(shí)沒(méi)有什么方法能獲得一個(gè)變量的類(lèi)型。

比如int a,用戶(hù)確實(shí)可以知道 a 是 int 類(lèi)型,但是如果想要通過(guò)代碼來(lái)計(jì)算出 a 的類(lèi)型,好像確實(shí)比較麻煩。

_Generic就解決了這個(gè)問(wèn)題,寫(xiě)個(gè)簡(jiǎn)單的代碼看下。
#include 


int main()
{
    int a;


    printf("%s
", _Generic((a), int : "int", char : "char"));


    return 0;
}
第一個(gè)表達(dá)式就是變量a,后面依次跟上可能的類(lèi)型,如果是int類(lèi)型,就輸出int,如果是char類(lèi)型,就輸出char。

為了看起來(lái)簡(jiǎn)單一些,我這里就寫(xiě)兩個(gè)。

運(yùn)行程序,確實(shí)輸出的就是int。 如果把代碼寫(xiě)的完整一些,可以來(lái)一個(gè)宏定義,然后把常見(jiàn)的類(lèi)型都寫(xiě)在后面,當(dāng)然,指針也沒(méi)有問(wèn)題。
#include 


#define TYPE_NAME(val) _Generic((val), int : "int", 
                                       char : "char", 
                                       short : "short", 
                                       float : "float", 
                                       double : "double", 
                                       int * : "int *", 
                                       default : "unkown")


int main()
{
inta;
    char b;
    int *c;
    double d;


    printf("%s
", TYPE_NAME(a));
    printf("%s
", TYPE_NAME(b));
    printf("%s
", TYPE_NAME(c));
    printf("%s
", TYPE_NAME(d));


    return 0;
}
再次運(yùn)行程序,這樣得到的結(jié)果就會(huì)更豐富一些。

有了這個(gè)基礎(chǔ),我們?cè)賮?lái)看下如何用它實(shí)現(xiàn)所謂的泛型編程。

比如還是實(shí)現(xiàn)兩個(gè)數(shù)字的相加。

先來(lái)兩個(gè)函數(shù),因?yàn)镃語(yǔ)言不支持函數(shù)重載,所以函數(shù)名得不一樣,一個(gè)叫add_int,一個(gè)叫add_float。
int add_int(int a,int b)
{
    printf("%d + %d = %d
",a,b,a+b);
    return a+b;
}


float add_float(float a,float b)
{
    printf("%f + %f = %f
",a,b,a+b);
    return a+b;
}


void unsupport()
{
    printf("unsupport type
");
}
然后來(lái)一個(gè)宏定義,根據(jù)第一個(gè)參數(shù)的類(lèi)型來(lái)匹配到底調(diào)用哪個(gè)函數(shù)。
#define ADD(x,y) _Generic((x),
    int:add_int(x,y),
    float:add_float(x,y),
    default:unsupport())
主函數(shù)里面調(diào)用ADD函數(shù),參數(shù)既可以是int,也可以是float。
int main()
{
    ADD(1, 2);
    ADD(1.11f, 2.22f);


    return 0;
}
運(yùn)行程序,確實(shí)也能達(dá)到C++函數(shù)模板的效果。
root@Turbo:test# ./1 
1 + 2 = 3
1.110000 + 2.220000 = 3.330000
root@Turbo:test#







審核編輯:劉清
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7632

    瀏覽量

    141785
  • C++語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    7303

原文標(biāo)題:C語(yǔ)言實(shí)現(xiàn)泛型編程

文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    詳解Rust的

    所有的編程語(yǔ)言都致力于將重復(fù)的任務(wù)簡(jiǎn)單化,并為此提供各種各樣的工具。在 Rust 中,(generics)就是這樣一種工具,它是具體類(lèi)型或其它屬性的抽象替代。在編寫(xiě)代碼時(shí),我們可以
    發(fā)表于 11-12 09:08 ?1295次閱讀

    Golang的使用

    眾所周知很多語(yǔ)言的function 中都支持 key=word 關(guān)鍵字參數(shù), 但 golang 是不支持的, 我們可以利用去簡(jiǎn)單的實(shí)現(xiàn)。
    發(fā)表于 08-16 12:24 ?431次閱讀

    Java的背景和作用

    Java的背景和作用 Java是Java編程語(yǔ)言中的一個(gè)特性,引入
    的頭像 發(fā)表于 09-20 14:30 ?1426次閱讀
    Java<b class='flag-5'>泛</b><b class='flag-5'>型</b>的背景和作用

    C語(yǔ)言簡(jiǎn)介--學(xué)前必備知識(shí) 精選資料推薦

    關(guān)鍵字32個(gè)關(guān)鍵字:CC++的關(guān)系C++支持面向過(guò)程編程、面向?qū)ο?b class='flag-5'>編程和
    發(fā)表于 07-22 07:51

    詳細(xì)介紹了Java、注解、并發(fā)編程

    介紹了Java、注解、并發(fā)編程、數(shù)據(jù)傳輸與序列化、高效IO、容器集合、反射與類(lèi)加載以及JVM重點(diǎn)知識(shí)線(xiàn)程、內(nèi)存模型、JVM運(yùn)行時(shí)內(nèi)存、垃圾回收與算法、Java中四種引用類(lèi)型、GC 分代收集算法
    發(fā)表于 08-20 06:09

    C語(yǔ)言編程是如何實(shí)現(xiàn)對(duì)數(shù)組中元素的線(xiàn)性搜索的

    C語(yǔ)言編程,實(shí)現(xiàn)對(duì)數(shù)組中元素的線(xiàn)性搜索。
    發(fā)表于 01-20 06:36

    C語(yǔ)言實(shí)現(xiàn)的型函數(shù)swap()

    C語(yǔ)言實(shí)現(xiàn)的型函數(shù)swap():交換兩個(gè)變量中的數(shù)據(jù).
    發(fā)表于 01-20 07:10

    C語(yǔ)言入門(mén)經(jīng)典-C語(yǔ)言編程

    C語(yǔ)言入門(mén)經(jīng)典-C語(yǔ)言編程,感興趣的可以看看哦。
    發(fā)表于 08-16 18:54 ?131次下載

    聊聊java實(shí)現(xiàn)的原理與好處

    摘要: 和C++以模板來(lái)實(shí)現(xiàn)靜多態(tài)不同,Java基于運(yùn)行時(shí)支持選擇了,兩者的實(shí)現(xiàn)原理大相庭徑。C++可以
    發(fā)表于 09-27 16:50 ?0次下載

    C++設(shè)計(jì)新思維-編程與設(shè)計(jì)之應(yīng)用

    C++設(shè)計(jì)新思維-編程與設(shè)計(jì)之應(yīng)用
    發(fā)表于 11-16 15:59 ?3次下載

    鴻蒙語(yǔ)言TypeScript學(xué)習(xí)第18天:【

    (Generics)是一種編程語(yǔ)言特性,允許在定義函數(shù)、類(lèi)、接口等時(shí)使用占位符來(lái)表示類(lèi)型,而不是具體的類(lèi)型。
    的頭像 發(fā)表于 04-16 14:56 ?665次閱讀
    鴻蒙<b class='flag-5'>語(yǔ)言</b>TypeScript學(xué)習(xí)第18天:【<b class='flag-5'>泛</b><b class='flag-5'>型</b>】

    Orin芯片的編程語(yǔ)言支持

    語(yǔ)言支持 Orin芯片支持多種編程語(yǔ)言,以滿(mǎn)足不同開(kāi)發(fā)者的需求。其中,C/
    的頭像 發(fā)表于 10-27 16:45 ?994次閱讀

    NPU支持編程語(yǔ)言有哪些

    NPU(Neural Processing Unit)是一種專(zhuān)門(mén)為深度學(xué)習(xí)和人工智能應(yīng)用設(shè)計(jì)的處理器。NPU支持編程語(yǔ)言通常與它所集成的平臺(tái)或框架緊密相關(guān)。以下是一些常見(jiàn)的編程
    的頭像 發(fā)表于 11-15 09:21 ?1942次閱讀

    Triton編譯器支持編程語(yǔ)言

    Triton編譯器支持編程語(yǔ)言主要包括以下幾種: 一、主要編程語(yǔ)言 Python :Triton編譯器通過(guò)Python接口提供了對(duì)Trit
    的頭像 發(fā)表于 12-24 17:33 ?967次閱讀

    gitee 支持編程語(yǔ)言有哪些

    Gitee 支持的常見(jiàn)編程語(yǔ)言: Python :一種廣泛使用的高級(jí)編程語(yǔ)言,以其清晰的語(yǔ)法和代碼可讀性而聞名。 Java :一種面向?qū)ο?/div>
    的頭像 發(fā)表于 01-06 09:50 ?674次閱讀