C语言的泛型编程

1 问题引入

  首先引入一个问题,实现一个泛型的swap函数,分别使用C++和C实现。

2 C++的泛型

  C++有良好的泛型编程机制,所以我很快就写出了C++版的泛型swap函数。

template<typename T>
void MySwap(T &a, T &b)
{
	T c = a;
	a = b;
	b = c;
}

3 C语言的泛型

  我的第一想法是既然不能直接交换变量(类型不知道),那就交换指针呀。下一瞬间,我就很想给自己一巴掌!是左值吗你就交换指针?Stupid!

  那就多传入一个参数喽,把大小传进去吧,然后我们直接根据大小来交换内存好了。好想法:

void MySwapC(void* a, void *b, int size)
{
	void *p = (void*)malloc(size);
	assert(p != NULL);

	memcpy(p, a, size);
	memcpy(a, b, size);
	memcpy(b, p, size);
}

4 总结

  运用一定的技巧,C语言也可以实现一定功能的泛型编程,但编程的时候一定要多加小心,C语言的泛型编程并不完善,并没有足够的类型检查,所以很容易出错。

时间: 2024-10-25 05:28:52

C语言的泛型编程的相关文章

C和C++中泛型编程 - 适应不同类型参数的函数

首先一个简单的问题,如何实现交换两个整数的值? 想必每个有编程经验的人都能作答. C语言用指针实现如下: void swap(int * a, int * b){ int tmp = *a; *a = *b; *b = tmp; } C++可以使用引用实现如下: void swap(int & a, int & b){ int tmp = a; a = b; b = tmp; } 顺便记录另外两个很有意思的实现,不用中间变量tmp (面试中可能会问到): void swap(int &am

快排序算法

快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实作出来. 使用快速排序法对一列数字进行排序的过程 本文地址:http://www.cnblogs.com/archimedes/p/quick-sort-algorithm.html,转载请注明源地址. 算法

C语言中void*详解及应用

void在英文中作为名词的解释为"空虚:空间:空隙":而在C语言中,void为"无类型",相应的void *为"无类型指针".void似乎只有"注释"和限制程序的作用,当然,这里的"注释"不是为我们人提供注释,而是为编译器提供一种所谓的注释. 本文地址:http://www.cnblogs.com/archimedes/p/c-void-point.html,转载请注明源地址. void的作用: 1.对函数

数据结构(02)_模板库的基础设施搭建

8.泛型编程简介 8.1.引言 数据额结果课程专注于数据元素之间的关系,和数据元素的操作方法,并不关系具体的数据类型,所以选择支持泛型编程的语言最为合适数据结构课程的学习. 8.2.泛型编程的概念 不考虑具体的数据类型的编程方式称为泛型编程,举例,对于swap函数考虑下面的泛型写法. void swap(T a, T b) { T t = a; a = b; b = t } 这里的T不是指具体的数据类型,而是泛指任意的数据类型.在C++语言中泛型编程通过模板实现. 8.3.C++的函模板模板 函

Swift语言中的泛型编程 【Generic】【Part 1】

泛型  泛型编程让你可以编写更具扩展性.易重用的功能,代码使用时的类型取决于你所定义的业务需求.你可以编写避免重复的代码,目标更加清晰明确,风格抽象. 泛型是Swift语言的一项强大的特性,基本上所有的swift标准库都建立在泛型代码上.实际上,你在这本书的时候不知不觉地接触到泛型,它贯穿始终.例如Swift的数组和字典类型都是泛型集合.你可以创建用于存放整数值的数组,也创建数组存储字符串,其他所有能在Swift中创建的类型都可以创建到数组中.类似的,你可以创建字典来存储数值或其他指定的类型,毫

JAVA语言泛型编程实现单例模式

今天去面试,面试官问了一个设计模式---单例模式,这也是我们最常用的设计模式,由于面试时间有限,我只是把如何使用泛型编程实现单例模式大致意思说了一下.现在主要说一下如何用泛型编程实现单例模式,使用少量代码,实现一劳永逸的方法. 先来看一下我们简单的object: package singleton; /***  *   * @author Linux一叶  * 只是为了测试时使用  *  */ public class People { /***  * 属性变量  * age 年龄  * nam

C 语言泛型编程--quickSort实现

1 #ifndef _GENERICQUICKSORT_H_ 2 #define _GENERICQUICKSORT_H_ 3 void generic_swap(void * pa, void * pb, int typeSize); 4 void generic_qsort(void * pa, int elemSize, int typeSize, 5 int (*cmp)(void *,void *)); 6 #endif generic_quick_sort.h 1 #include

语言总结&mdash;C/C++

参考<程序员面试宝典> 1. 基本概念 1.1 赋值语句 例1. 按位与操作,例如:a=3,b=3,a&b值等于 0011 & 0011 结果还是0011,那么值还是3: a=4,b=3,a|b:按位或操作, 0100 | 0011 结果是0111,输出的值为7:a||b, a和b进行或运算,只要两者有一个为真则结果即为1. 例2. while(x) { count++; x=x&(x-1);} 此循环用来求输入值x转化为二进制后1的个数.eg:9(1001)&

泛型编程(模板)

;泛型编程 即是广泛的类型编程的意思,常常用于那些函数重复编写但只有参数类型或者返回值不同,常用泛型编程解决,C语言呢用宏解决 ;c++实现泛型编程用templeate模板来实现,其实就是代码的复制,当编译器扫描到模板初始化语法那么就会在当前文件中实例化一个函数或者类到本文件中,实例化的模板是存在实体的所以可以调试,而模板是不存在实体的,宏替换之后也不存在实体 函数模板(只写函数的实现而不关心其类型,类型通过外部初始化的时候增加一个叫做类型的参数来初始化一个函数模板或者类模板), 定义:每个函数