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++可视化角色按键移动控制的实现

    C++可视化角色按键移动控制的实现

    这篇文章主要介绍了C++可视化角色按键移动控制的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2020-03-03
  • 使用C++获取逻辑执行毫秒数的方法

    使用C++获取逻辑执行毫秒数的方法

    这篇文章主要为大家详细介绍了如何使用C++获取逻辑执行毫秒数的方法,文中借助c++11提供的steady_clock,实现了精确获取逻辑执行时间的方法,需要的可以参考下
    2024-02-02
  • c++中stack、queue和vector的基本操作示例

    c++中stack、queue和vector的基本操作示例

    这篇文章主要给大家介绍了关于c++中stack、queue和vector基本操作的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-08-08
  • VS+Qt+Halcon 显示图片,实现鼠标缩放、移动图片

    VS+Qt+Halcon 显示图片,实现鼠标缩放、移动图片

    本篇博文记录一下,用VS+Qt+Halcon实现对图片的读取以及鼠标缩放,移动(鼠标事件调用了halcon自带的算子)的过程。感兴趣的可以了解一下
    2021-08-08
  • floyd算法实现思路及实例代码

    floyd算法实现思路及实例代码

    这篇文章主要介绍了floyd算法实现思路及实例代码,有需要的朋友可以参考一下
    2014-01-01
  • 解决C语言数组元素循环右移的问题

    解决C语言数组元素循环右移的问题

    今天小编就为大家分享一篇解决C语言数组元素循环右移的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • C语言进阶几分钟带你理解大小端存储模式

    C语言进阶几分钟带你理解大小端存储模式

    这篇文章主要为大家介绍了C语言进阶大小端模式的示例详解,带各位读者朋友五分钟脚踩大小端模式,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-02-02
  • C语言编程动态内存分配常见错误全面分析

    C语言编程动态内存分配常见错误全面分析

    这篇文章主要介绍了C语言编程中动态内存分配的常见错误全面分析讲解,同样遇到过C语言动态内存分配各种问题的同学可以借鉴参考下,希望能够有所帮助
    2021-10-10
  • C语言实现打印星号图案

    C语言实现打印星号图案

    这篇文章主要介绍了C语言实现打印星号图案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • OpenGL实现不规则区域填充算法

    OpenGL实现不规则区域填充算法

    这篇文章主要为大家详细介绍了OpenGL实现不规则区域填充算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02

最新评论