0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言是否支持泛型编程?

学益得智能硬件 来源:学益得智能硬件 2023-10-16 10:02 次阅读

C语言是否支持泛型编程?毫无疑问,答案是不支持。

什么是泛型编程,我觉得用C++里面的模板可以很好的说明。

#include


//函数模板
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;
}
比如函数add就是一个模板函数,它既能支持整数的相加,也能支持浮点数的相加,甚至是其他的自定义类型,只要能提供相加的规则,编译器都能通过。

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

C语言本身并不支持泛型,好在C11标准后,新增了关键字_Generic,它可以支持轻量级的泛型编程。

_Generic的作用,如果用一句话来描述,就是可以获得变量的类型。

大家可以想一下,在C语言里面,好像确实没有什么方法能获得一个变量的类型。

比如int a,用户确实可以知道 a 是 int 类型,但是如果想要通过代码来计算出 a 的类型,好像确实比较麻烦。

_Generic就解决了这个问题,写个简单的代码看下。
#include 


int main()
{
    int a;


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


    return 0;
}
第一个表达式就是变量a,后面依次跟上可能的类型,如果是int类型,就输出int,如果是char类型,就输出char。

为了看起来简单一些,我这里就写两个。

运行程序,确实输出的就是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

    文章

    7530

    浏览量

    128763
  • C++语言
    +关注

    关注

    0

    文章

    146

    浏览量

    6878

原文标题:C语言实现泛型编程

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Python与C#对比

    个类只能继承一个类,当然C#为了弥补单继承的不足,还带来了interface,一个类可以继承多个interface;8. Python没有,或者说不需要
    发表于 05-14 17:14

    C语言—单片机编程使用的高级语言

    今天主要分享单片机编程使用的高级语言C语言,单片机编程中使用C
    发表于 10-20 16:38

    labview连接mongdb问题,找到不.NET类中的

    有没有人用labview连接mongodb数据库的?已下载mongodb的c#驱动,利用labview中的.net控件调用相关函数,但是驱动中有部分函数在类中, labview能调用c
    发表于 04-08 13:38

    如何从零学习一门编程语言,并由此拿到高薪

    符、赋值运算符等。有些语言还提供位运算符、特殊运算符,视情节掌握。注释(没啥好说的)七、函数编程语言基本都有函数。注意语法格式:是否支持出参
    发表于 07-06 17:36

    如何从零学习一门编程语言

    、逻辑运算符、赋值运算符等。有些语言还提供位运算符、特殊运算符,视情节掌握。注释(没啥好说的)七、函数编程语言基本都有函数。注意语法格式:是否支持
    发表于 07-09 11:09

    8051的C语言编程和传统的C语言编程有何不同

    8051的C语言编程和传统的C语言编程是类似的。当然其中有些数据类型是不一样的,我们知道8051
    发表于 07-15 07:47

    C语言简介--学前必备知识 精选资料推荐

    关键字32个关键字:CC++的关系C++支持面向过程编程、面向对象编程
    发表于 07-22 07:51

    详细介绍了Java、注解、并发编程

    介绍了Java、注解、并发编程、数据传输与序列化、高效IO、容器集合、反射与类加载以及JVM重点知识线程、内存模型、JVM运行时内存、垃圾回收与算法、Java中四种引用类型、GC 分代收集算法
    发表于 08-20 06:09

    冒泡排序法的实现

    冒泡排序法的实现,自用笔记!
    发表于 01-20 07:22

    C语言编程是如何实现对数组中元素的线性搜索的

    C语言编程,实现对数组中元素的线性搜索。
    发表于 01-20 06:36

    C语言实现的型函数swap()

    C语言实现的型函数swap():交换两个变量中的数据.
    发表于 01-20 07:10

    C编程语言的基本介绍

    单片机c语言+编程c语言In this tutorial you will get basic introduction to
    发表于 01-24 06:28

    HarmonyOS应用开发支持哪几种编程语言

    Studio上,提供了多种编程语言给开发者来进行HarmonyOS的应用开发。主要支持Java、JS和C/C++三种
    发表于 04-07 14:49

    Linux下C语言编程入门教程

    编程风格等。u3000u3000Linux 作为一个优秀的操作系统,一项非常重要的功能就是支持系统调用尤其是支持C语言的系统调用功能十分的方
    发表于 09-22 06:56

    五种支持plc编程语言有哪些

    在PLC控制系统设计中,不同型号的PLC编程软件对以上五种编程语言支持种类是不同的,所以不但对PLC的硬件性能了解外,也要了解PLC对编程
    发表于 08-31 14:54 696次阅读
    五种<b class='flag-5'>支持</b>plc<b class='flag-5'>编程</b>的<b class='flag-5'>语言</b>有哪些