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

    文章

    7604

    浏览量

    136539
  • C++语言
    +关注

    关注

    0

    文章

    147

    浏览量

    6986

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

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

收藏 人收藏

    评论

    相关推荐

    详解Rust的

    所有的编程语言都致力于将重复的任务简单化,并为此提供各种各样的工具。在 Rust 中,(generics)就是这样一种工具,它是具体类型或其它属性的抽象替代。在编写代码时,我们可以
    发表于 11-12 09:08 1056次阅读

    Golang的使用

    众所周知很多语言的function 中都支持 key=word 关键字参数, 但 golang 是不支持的, 我们可以利用去简单的实现。
    发表于 08-16 12:24 276次阅读

    Java的背景和作用

    Java的背景和作用 Java是Java编程语言中的一个特性,引入
    的头像 发表于 09-20 14:30 1063次阅读
    Java<b class='flag-5'>泛</b><b class='flag-5'>型</b>的背景和作用

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

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

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

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

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

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

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

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

    C语言入门经典-C语言编程

    C语言入门经典-C语言编程,感兴趣的可以看看哦。
    发表于 08-16 18:54 126次下载

    聊聊java实现的原理与好处

    摘要: 和C++以模板来实现静多态不同,Java基于运行时支持选择了,两者的实现原理大相庭径。C++可以
    发表于 09-27 16:50 0次下载

    单片机c语言+编程c语言_C编程语言简介

    单片机c语言+编程c语言In this tutorial you will get basic introduction to
    发表于 11-29 10:21 38次下载
    单片机<b class='flag-5'>c</b><b class='flag-5'>语言</b>+<b class='flag-5'>编程</b><b class='flag-5'>c</b><b class='flag-5'>语言</b>_<b class='flag-5'>C</b><b class='flag-5'>编程</b><b class='flag-5'>语言</b>简介

    C++设计新思维-编程与设计之应用

    C++设计新思维-编程与设计之应用
    发表于 11-16 15:59 3次下载

    微软公布 .NET编程语言支持策略C#、F#和Visual Basic

    微软在 .NET 平台上提供了对 3 种编程语言支持 —— C#、F# 和 Visual Basic。近日它公布了针对每种语言的最新
    的头像 发表于 02-14 11:28 1351次阅读

    鸿蒙语言TypeScript学习第18天:【

    (Generics)是一种编程语言特性,允许在定义函数、类、接口等时使用占位符来表示类型,而不是具体的类型。
    的头像 发表于 04-16 14:56 356次阅读
    鸿蒙<b class='flag-5'>语言</b>TypeScript学习第18天:【<b class='flag-5'>泛</b><b class='flag-5'>型</b>】

    Orin芯片的编程语言支持

    语言支持 Orin芯片支持多种编程语言,以满足不同开发者的需求。其中,C/
    的头像 发表于 10-27 16:45 245次阅读

    NPU支持编程语言有哪些

    NPU(Neural Processing Unit)是一种专门为深度学习和人工智能应用设计的处理器。NPU支持编程语言通常与它所集成的平台或框架紧密相关。以下是一些常见的编程
    的头像 发表于 11-15 09:21 530次阅读