C语言是否支持泛型编程?毫无疑问,答案是不支持。
什么是泛型编程,我觉得用C++里面的模板可以很好的说明。
#include比如函数add就是一个模板函数,它既能支持整数的相加,也能支持浮点数的相加,甚至是其他的自定义类型,只要能提供相加的规则,编译器都能通过。//函数模板 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标准后,新增了关键字_Generic,它可以支持轻量级的泛型编程。
_Generic的作用,如果用一句话来描述,就是可以获得变量的类型。
大家可以想一下,在C语言里面,好像确实没有什么方法能获得一个变量的类型。
比如int a,用户确实可以知道 a 是 int 类型,但是如果想要通过代码来计算出 a 的类型,好像确实比较麻烦。
_Generic就解决了这个问题,写个简单的代码看下。
#include第一个表达式就是变量a,后面依次跟上可能的类型,如果是int类型,就输出int,如果是char类型,就输出char。int main() { int a; printf("%s ", _Generic((a), int : "int", char : "char")); return 0; }
为了看起来简单一些,我这里就写两个。
运行程序,确实输出的就是int。 如果把代码写的完整一些,可以来一个宏定义,然后把常见的类型都写在后面,当然,指针也没有问题。
#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; }
有了这个基础,我们再来看下如何用它实现所谓的泛型编程。
比如还是实现两个数字的相加。
先来两个函数,因为C语言不支持函数重载,所以函数名得不一样,一个叫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 "); }然后来一个宏定义,根据第一个参数的类型来匹配到底调用哪个函数。
#define ADD(x,y) _Generic((x), int:add_int(x,y), float:add_float(x,y), default:unsupport())主函数里面调用ADD函数,参数既可以是int,也可以是float。
int main() { ADD(1, 2); ADD(1.11f, 2.22f); return 0; }运行程序,确实也能达到C++函数模板的效果。
root@Turbo:test# ./1 1 + 2 = 3 1.110000 + 2.220000 = 3.330000 root@Turbo:test#
审核编辑:刘清
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
C语言
+关注
关注
180文章
7602浏览量
136357 -
C++语言
+关注
关注
0文章
147浏览量
6978
原文标题:C语言实现泛型编程
文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
详解Rust的泛型
所有的编程语言都致力于将重复的任务简单化,并为此提供各种各样的工具。在 Rust 中,泛型(generics)就是这样一种工具,它是具体类型或其它属性的抽象替代。在编写代码时,我们可以
发表于 11-12 09:08
•1053次阅读
Golang泛型的使用
众所周知很多语言的function 中都支持 key=word 关键字参数, 但 golang 是不支持的, 我们可以利用泛型去简单的实现。
发表于 08-16 12:24
•269次阅读
详细介绍了Java泛型、注解、并发编程
介绍了Java泛型、注解、并发编程、数据传输与序列化、高效IO、容器集合、反射与类加载以及JVM重点知识线程、内存模型、JVM运行时内存、垃圾回收与算法、Java中四种引用类型、GC 分代收集算法
发表于 08-20 06:09
微软公布 .NET编程语言支持策略C#、F#和Visual Basic
微软在 .NET 平台上提供了对 3 种编程语言的支持 —— C#、F# 和 Visual Basic。近日它公布了针对每种语言的最新
NPU支持的编程语言有哪些
NPU(Neural Processing Unit)是一种专门为深度学习和人工智能应用设计的处理器。NPU支持的编程语言通常与它所集成的平台或框架紧密相关。以下是一些常见的编程
评论