C语言泛型选择编程示例详解

 更新时间:2023年09月15日 09:02:50   作者:不停感叹的老林  
这篇文章主要介绍了C语言泛型选择编程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

相比C++模板, C语言进行泛型编程没有天然优势, 但并不意味着不能打.

自C11起, C语言已经提供泛型选择功能, 也就是通过系统特性, 不那么顺畅, 但是也勉强可以做一定的泛型了.

同时由于void*的类型抹除性质, 可以做类似C++标准库泛型算法的伪泛型函数.

一、_Generic关键字

_Generic是C11的新特性, 它能根据变量类型, 选择要执行的表达式,

_Generic(expression, type1: code block1, type2: code block2, ..., default: code blockn)

比如最简单的, 打印一个可能是int, 也可能是float 的值:

#include <stdio.h>
#define print(f)                                                               \
    if (_Generic(f, int: 0, float: 1))                                         \
    {                                                                          \
        printf("float = %f\n", f);                                             \
    }                                                                          \
    else                                                                       \
    {                                                                          \
        printf("int = %d\n", f);                                               \
    }
int main()
{
    float f = 5.5F;
    print(f);
    int i = 9;
    print(i);
    return 0;
}

相比C++, 以上代码需要用宏模拟泛型, 比较令人诟病的是debug比较困难, 而且本质上这种泛型没有减少代码量, 也不够自动, 简单代码好说, 复杂代码就比较麻烦了.

二、类型抹除伪泛型

最为典型的是C标准库的qsort()函数, 通过将数组类型抹除为void*, 可以传入任何类型数组, 通过特定的比较函数, 确定类型, 实现泛型功能.

qsort(void *Base,                                      // 数组地址
          size_t NumOfElements,                            // 元素数量
          size_t SizeOfElements,                           // 元素大小
          int (*PtFuncCompare)(const void *, const void *) // 比较函数
    );

这个用_Generic恐怕就会非常繁琐了, 虽然可以少一个元素大小的参数.

总结

现在不能说C语言没有泛型功能了,只不过和C++相比, 还是有点繁琐, 困难, 难以debug, 但以C的性格, 能加入这种特性, 已经是很给面子了.

以上就是C语言泛型选择编程示例详解的详细内容,更多关于C语言泛型选择的资料请关注脚本之家其它相关文章!

相关文章

  • 一文详解C++11中auto的使用

    一文详解C++11中auto的使用

    这篇文章主要为大家分享一下C++11中auto关键字的使用示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2023-07-07
  • C++实现字符串切割的两种方法

    C++实现字符串切割的两种方法

    这篇文章主要介绍了C++实现字符串切割的两种方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 利用反射获得类的public static/const成员的值实例

    利用反射获得类的public static/const成员的值实例

    下面小编就为大家带来一篇利用反射获得类的public static/const成员的值实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C语言中进行大小写字母转化的示例代码

    C语言中进行大小写字母转化的示例代码

    C语言标准库中提供了用于大小写转换的函数,使得这一操作变得简单而高效,本文将详细介绍如何在C语言中进行大小写字母的转换,包括相关的函数和示例代码,需要的朋友可以参考下
    2024-03-03
  • C语言实现手机电话簿管理系统

    C语言实现手机电话簿管理系统

    这篇文章主要为大家详细介绍了C语言实现手机电话簿管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++中cin的用法详细

    C++中cin的用法详细

    这篇文章主要介绍了C++中cin的用法详细,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • C++实现LeetCode(136.单独的数字)

    C++实现LeetCode(136.单独的数字)

    这篇文章主要介绍了C++实现LeetCode(136.单独的数字),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 解析C++中临时对象的产生情况

    解析C++中临时对象的产生情况

    临时对象的产生和销毁都是有成本的,都会影响程序的执行性能和效率,所以如果能了解临时对象产生的原因,就可以提升程序的性能和效率,下面小编就来和大家聊聊临时对象产生的几种情况吧
    2023-06-06
  • Matlab绘制雨云图的方法详解

    Matlab绘制雨云图的方法详解

    这篇文章主要介绍了如何利用Matlab实现雨云图的绘制,文中的示例代码讲解详细,对我们学习Matlab有一定的帮助,需要的可以参考一下
    2022-05-05
  • 浅谈C++中的引用和指针

    浅谈C++中的引用和指针

    这篇文章主要介绍了浅谈C++中的引用和指针,C++允许为已定义的变量再起一个新的别名,称为变量的引用名,引用名看起来像是一个变量名,但它是一种特殊变量,称为引用变量,或简称为引用,需要的朋友可以参考下
    2023-08-08

最新评论