返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言中怎么实现泛型编程
  • 883
分享到

C语言中怎么实现泛型编程

2023-06-15 19:06:17 883人浏览 独家记忆
摘要

这篇文章给大家介绍C语言中怎么实现泛型编程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。泛型编程(generic  programming)是程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中

这篇文章给大家介绍C语言中怎么实现泛型编程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

泛型编程(generic  programming)是程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。c++支持泛型编程,也就是模板,比如:

// 来源:公众号【 编程珠玑】 // 作者:守望先生 #include <iOStream> template <class T> T add(T a,T b){   T ret = a + b;   std::cout<< a << " + " << b <<" = " << ret << std::endl;   return ret; } int main(){   add(1,2);  // 整数相加   add(1.2,2.3); // 浮点数相加   return 0; }

运行结果:

1 + 2 = 3 1.2 + 2.3 = 3.5

从上面的结果可以看到,对于调用add函数,如果传入的是整型,则按照整型加法计算,如果是浮点数,则按照浮点数进行加法计算。也就是说,add函数没有针对特定类型(泛型)。

你同样可以使用重载实现上面的功能,但是存在大量重复代码。

C语言支持泛型编程吗?

很遗憾,C语言本身不支持真正意义上的泛型编程,但是却在一定程度上可以“实现泛型编程”。

_Generic关键字

_Generic是C11的关键字,通过该关键字可以有一个泛型表达式:

_Generic((value). int:"int", float:"float",char*:"char*",default:"other type")

什么意思呢?如果value是int类型,那么表达式的值就是“int”,其他的以此类推。看起来是不是和switch语句有点类似呢?

根据这个示例,我们来实现一个功能,打印变量或常量到底是什么类型:

// 来源:公众号【编程珠玑】 // 作者:守望先生 #include <stdio.h> #define TYPE(v) _Generic((v), \     int:"int", \     char:"char", \     float:"float", \     double:"double", \     char*:"char*", \     default:"other type") int main(void) {     printf("1 + 2 type: %s\n",TYPE(1 + 2));     printf("1/3 type: %s\n",TYPE(1/3));     printf("2/3 type: %s\n",TYPE((float)2/3));     printf("xxx type: %s\n",TYPE("xxx"));     return 0; }

这里为了方便使用,我们通过define关键字,将泛型表达式简化。

运行结果:

1 + 2 type: int 1/3 type: int 2/3 type: float                                                         xxx type: char*

可以看到通过TYPE就可以获得表达式的结果类型,这对初学者来说,可真是福音了。

泛型算法

既然C语言有_Generic关键字了,那么我们尝试实现开头C++示例代码中的加法。看过上面的例子后,相信你已经会了:

// 来源:公众号【编程珠玑】 // 作者:守望先生 #include <stdio.h> // int类型加法 int addI(int a, int b) {     printf("%d + %d = %d\n",a,b, a + b );     return (a + b); } // double类型加法 double addF(double a, double b) {     printf("%f + %f = %f\n",a,b, a + b );     return (a + b); } void unsupport(int a,int b) {     printf("unsupport type\n"); } #define ADD(a,b) _Generic((a), \     int:addI(a,b),\     double:addF(a,b), \     default:unsupport(a,b)) int main(void) {     ADD(1 , 2);     ADD(1.1,2.2);     return 0; }

观察上面的代码,我们注意到:

  • 在这里,我们需要定义两种类型的加法(实际上,通过C++的模板,由编译器帮我们完成了这件事),由于C语言中并不支持重载,因此两个加法的函数名不一样。

  • 由于涉及参数有两个,在做类型判断时,如果两个参数不一致,可能仍然存在编译问题

  • 调用者无需区分被加对象是什么类型,都可以统一使用ADD

C99的tgmath.h

前面说到,_Generic关键字在C11中才有,那么C99怎么办呢?实际上,tgmath.h中提供了一些泛型类型宏,如果math.h的函数中定义了float,double和long  double版本,tgmath就会提供一个泛型类型宏。效果和前面的例子一样,举个例子:

// 来源:公众号【编程珠玑】 // 作者:守望先生 #include <stdio.h> #include <tgmath.h> int main(void) {     float f = 4.0f;     long double d = 1.44;     printf("%f\n",sqrt(f)); // 实际上调用了sqrtf     printf("%Lf\n",sqrt(d)); // 实际上调用了sqrtl     return 0; }

编译运行结果:

2.000000 1.200000

但是不得不说,tgmath中提供的泛型宏也是有限的。

void *指针

众所周知,C语言中void  *指针是一种无类型指针,从这点看,也可以算是泛型指针了。而它的使用在C语言中是非常常见的,举例来说,在《高级指针话题-函数指针》中,我们介绍了快速排序接口的使用,它的函数声明是这样的:

#include <stdlib.h> void qsort(void *base, size_t nmemb, size_t size,                   int (*compar)(const void *, const void *));

库函数qsort实际上就是泛型排序算法了,它可以针对任何类型的数据进行排序。当然有一个前提,就是你需要按照它的协议,实现一个compar函数,用于比较大小。

关于C语言中怎么实现泛型编程就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: C语言中怎么实现泛型编程

本文链接: https://lsjlt.com/news/281456.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言中怎么实现泛型编程
    这篇文章给大家介绍C语言中怎么实现泛型编程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。泛型编程(generic  programming)是程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中...
    99+
    2023-06-15
  • C语言中如何实现泛型编程
    今天小编给大家分享一下C语言中如何实现泛型编程的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。泛型编程(generic &nb...
    99+
    2023-06-17
  • 基于C语言实现泛型编程详解
    目录心理历程轮子用法大体流程部分源码心理历程 写了一段时间C++后,真心感觉STL里的容器是个好东西。一个容器可以容纳任意类型,容器对外的接口可以操作任意类型的数据,甚至包括自定义类...
    99+
    2024-04-02
  • C++ 中怎么实现数组类泛型编程
    这篇文章给大家介绍C++ 中怎么实现数组类泛型编程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。原创:C++ 简单实现数组类泛型编程示例1、使用模板来实现泛型编程2、本数组应该能够存储各种基础类型,各种复杂的类类型3、...
    99+
    2023-06-04
  • C语言的模板与泛型编程是什么
    本篇内容主要讲解“C语言的模板与泛型编程是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言的模板与泛型编程是什么”吧!模板与泛型编程浅谈摘要(Effective C++):C++temp...
    99+
    2023-06-29
  • C#中怎么实现泛型处理
    C#中怎么实现泛型处理,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C#泛型处理的问题陈述考虑一种普通的、提供传统 Push() 和 Pop() 方法的数据结构(例如,堆栈)。...
    99+
    2023-06-17
  • C语言的模板与泛型编程你了解吗
    目录模板与泛型编程浅谈摘要(Effective C++):模板与泛型编程简单介绍函数模板模板编译类模板为什么我们需要模板特例化?总结模板与泛型编程浅谈 摘要(Effective C+...
    99+
    2024-04-02
  • 如何在Go语言中使用泛型编程
    在Go语言中使用泛型编程是很多开发者所期待的功能,因为泛型编程可以使代码更加灵活、可复用性更高。目前,Go语言中并不原生支持泛型编程,但是在Go 1.18版本中引入了泛型的实验性功能,...
    99+
    2024-03-10
    使用 go语言 泛型
  • C语言实现SOCKET编程
    以下是一个简单的C语言示例,演示了如何使用socket编程创建一个简单的服务器和客户端。在此示例中,服务器将侦听来自客户端的消息并将...
    99+
    2023-09-27
    c语言
  • Go语言泛型实现多类型支持
    go 语言泛型提供了多类型支持,允许开发者创建可用于多种类型的代码。泛型语法通过在类型名称中指定类型参数声明泛型类型,并在函数调用中自动推断类型参数。泛型支持可比较类型,并可用于创建通用...
    99+
    2024-04-03
    go语言 泛型 golang
  • C语言中怎么实现协程
    本篇内容主要讲解“C语言中怎么实现协程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言中怎么实现协程”吧!协程vs线程对比使用多线程来解决IO阻塞任务,使用...
    99+
    2024-04-02
  • c语言中怎么实现qp编解码
    本篇文章给大家分享的是有关c语言中怎么实现qp编解码,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 void DecodeQP(ngx_str_t *des...
    99+
    2023-06-04
  • C语言怎么实现BOOL类型
    本文小编为大家详细介绍“C语言怎么实现BOOL类型”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言怎么实现BOOL类型”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。C语言实现BOOL类型C语言功能强大,语法...
    99+
    2023-07-05
  • go语言中泛型是什么
    在go语言中,泛型就是编写模板适应所有类型,只有在具体使用时才定义具体变量类型;通过引入类型形参和类型实参的概念,让一个函数能够处理多种不同类型数据的能力,这种编程方式被称为泛型编程。本教程操作环境:windows7系统、GO 1.18版本...
    99+
    2023-05-14
    泛型 Go Golang go语言
  • C语言编程怎么实现扫雷游戏
    这篇文章主要讲解了“C语言编程怎么实现扫雷游戏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言编程怎么实现扫雷游戏”吧!在我们熟知的扫雷中,我们点击小方块,小方块要么出现数字,要么遇到地...
    99+
    2023-06-20
  • 模板库和泛型库在 C++ 泛型编程中的作用?
    模板库和泛型库通过允许数据类型参数化和提供预定义的模板来实现泛型编程,提高了代码的可复用性和灵活性,包括:模板库:提供模板声明机制,创建根据数据类型参数化的类型或函数,例如 std::v...
    99+
    2024-04-24
    c++ 泛型编程
  • 如何利用 C++ 函数模板实现泛型编程?
    泛型编程通过函数模板实现,允许创建通用的代码处理不同类型的数据,无需修改源代码。函数模板的基本语法为:template returntype functionname(t arg1, ...
    99+
    2024-04-15
    泛型编程 c++函数模板 c++
  • C++ 函数重载如何用于实现泛型编程?
    函数重载允许创建具有相同名称但参数不同的函数,从而实现泛型编程。它允许我们编写代码来处理不同类型的参数,同时使用相同的函数名称。在实战中,我们可以使用重载函数对不同类型的数据进行求和,例...
    99+
    2024-04-13
    c++ 函数重载
  • C/C++编程语言中的pointer怎么用
    这篇文章主要介绍“C/C++编程语言中的pointer怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C/C++编程语言中的pointer怎么用”文章能帮助大家解决问题。1 What指针,是 C...
    99+
    2023-06-29
  • C语言怎么实现协程
    这篇文章主要介绍“C语言怎么实现协程”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言怎么实现协程”文章能帮助大家解决问题。协程是一种用户空间的非抢占式线程,主要用来解决等待大量的IO操作的问题。...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作