C語言是否支持泛型編程?毫無疑問,答案是不支持。
什么是泛型編程,我覺得用C++里面的模板可以很好的說明。
#include比如函數(shù)add就是一個模板函數(shù),它既能支持整數(shù)的相加,也能支持浮點數(shù)的相加,甚至是其他的自定義類型,只要能提供相加的規(guī)則,編譯器都能通過。//函數(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; }
泛型編程可以大大的提高編程的效率。
C語言本身并不支持泛型,好在C11標(biāo)準(zhǔn)后,新增了關(guān)鍵字_Generic,它可以支持輕量級的泛型編程。
_Generic的作用,如果用一句話來描述,就是可以獲得變量的類型。
大家可以想一下,在C語言里面,好像確實沒有什么方法能獲得一個變量的類型。
比如int a,用戶確實可以知道 a 是 int 類型,但是如果想要通過代碼來計算出 a 的類型,好像確實比較麻煩。
_Generic就解決了這個問題,寫個簡單的代碼看下。
#include第一個表達(dá)式就是變量a,后面依次跟上可能的類型,如果是int類型,就輸出int,如果是char類型,就輸出char。int main() { int a; printf("%s ", _Generic((a), int : "int", char : "char")); return 0; }
為了看起來簡單一些,我這里就寫兩個。
運(yùn)行程序,確實輸出的就是int。 如果把代碼寫的完整一些,可以來一個宏定義,然后把常見的類型都寫在后面,當(dāng)然,指針也沒有問題。
#include再次運(yùn)行程序,這樣得到的結(jié)果就會更豐富一些。#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; }
有了這個基礎(chǔ),我們再來看下如何用它實現(xiàn)所謂的泛型編程。
比如還是實現(xiàn)兩個數(shù)字的相加。
先來兩個函數(shù),因為C語言不支持函數(shù)重載,所以函數(shù)名得不一樣,一個叫add_int,一個叫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 "); }然后來一個宏定義,根據(jù)第一個參數(shù)的類型來匹配到底調(diào)用哪個函數(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)行程序,確實也能達(dá)到C++函數(shù)模板的效果。
root@Turbo:test# ./1 1 + 2 = 3 1.110000 + 2.220000 = 3.330000 root@Turbo:test#
審核編輯:劉清
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
C語言
+關(guān)注
關(guān)注
180文章
7604瀏覽量
136841 -
C++語言
+關(guān)注
關(guān)注
0文章
147瀏覽量
6992
原文標(biāo)題:C語言實現(xiàn)泛型編程
文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
詳解Rust的泛型
所有的編程語言都致力于將重復(fù)的任務(wù)簡單化,并為此提供各種各樣的工具。在 Rust 中,泛型(generics)就是這樣一種工具,它是具體類型或其它屬性的抽象替代。在編寫代碼時,我們可以
發(fā)表于 11-12 09:08
?1065次閱讀
Golang泛型的使用
眾所周知很多語言的function 中都支持 key=word 關(guān)鍵字參數(shù), 但 golang 是不支持的, 我們可以利用泛型去簡單的實現(xiàn)。
發(fā)表于 08-16 12:24
?281次閱讀
C語言簡介--學(xué)前必備知識 精選資料推薦
關(guān)鍵字32個關(guān)鍵字:C和C++的關(guān)系C++支持面向過程編程、面向?qū)ο?b class='flag-5'>編程和
發(fā)表于 07-22 07:51
詳細(xì)介紹了Java泛型、注解、并發(fā)編程
介紹了Java泛型、注解、并發(fā)編程、數(shù)據(jù)傳輸與序列化、高效IO、容器集合、反射與類加載以及JVM重點知識線程、內(nèi)存模型、JVM運(yùn)行時內(nèi)存、垃圾回收與算法、Java中四種引用類型、GC 分代收集算法
發(fā)表于 08-20 06:09
聊聊java泛型實現(xiàn)的原理與好處
摘要: 和C++以模板來實現(xiàn)靜多態(tài)不同,Java基于運(yùn)行時支持選擇了泛型,兩者的實現(xiàn)原理大相庭徑。C++可以
發(fā)表于 09-27 16:50
?0次下載
微軟公布 .NET編程語言支持策略C#、F#和Visual Basic
微軟在 .NET 平臺上提供了對 3 種編程語言的支持 —— C#、F# 和 Visual Basic。近日它公布了針對每種語言的最新
NPU支持的編程語言有哪些
NPU(Neural Processing Unit)是一種專門為深度學(xué)習(xí)和人工智能應(yīng)用設(shè)計的處理器。NPU支持的編程語言通常與它所集成的平臺或框架緊密相關(guān)。以下是一些常見的編程
Triton編譯器支持的編程語言
Triton編譯器支持的編程語言主要包括以下幾種: 一、主要編程語言 Python :Triton編譯器通過Python接口提供了對Trit
評論