C的宏定义实现模板函数——C的C++模板函数机制实现

转载 2013年12月05日 09:56:18

近日移植TightVNC,关于RectangleUpdate的编码,处理不同色彩位深bits/pixe( 8,16,32)有着极其相似的处理方法,由于C中没有模板函数的概念,因而采用了宏定义来处理,与模板函数有着异曲同工之妙。现摘录分析如下(代码有删节):

Rfbproto.c文件中

/* CONCAT2 concatenates its two arguments.
CONCAT2E does the same but also expands its arguments if they are macros
注解:CONCAT2(a,b)直接将两字符串连接成新的字符串。而CONCAT2E(a,b),如果a和b被其它的宏定义了话,则会对a和b进行解释替换后,再合成新的字符串。*/

#define CONCAT2(a,b) a##b
#define CONCAT2E(a,b) CONCAT2(a,b)

#define BPP 8
#include “rre.c”
#undef BPP

#define BPP 16
#include “rre.c”
#undef BPP

 

#define BPP 32
#include “rre.c”
#undef BPP

 

“rre.c”文件如下:
#define HandleRREBPP CONCAT2E(HandleRRE,BPP)
#define CARDBPP CONCAT2E(CARD,BPP)

static bool HandleRREBPP (int rx, int ry, int rw, int rh)
{…}

这样在使用者文件rfbproto.c中,为BPP定义了三个值,做了三次包含。每次包含的过程:

所定义的函数HandleRREBPP被替换成CONCAT2E(HandleRRE, BPP),进而再次被替换成CONCAT2E(HandleRRE, [8,16,32]),然后经由CONCAT2(HandleRRE, [8,16,32])替换成HandleRRE[8,16,32],于是就有了HandleRRE8, HandleRRE16, HandleRRE32。

其整个过程是,通过三次包含,将HandleRREBPP替换为HandleRRE8, HandleRRE16和HandleRRE32。其方法核心是先将HandleRREBPP都替换为CONCAT2E(HandleRRE,BPP),通过引入不同的BPP值,然后再合并。

其效果类似于C++中的函数模板。C++模板由编译器根据不同模板实参生成具体的实例函数,而此处则是通过指定宏的值,然后手工三次包含,利用预编译,完成替换。

可见,再次印证了C跟C++比,并不缺某些机制。换句话说,C++的特有机制,用C也可以变通实现,就像C++的面向对象和动态联编,在C中也可以类似实现,只不过需要手工去做,有些繁琐罢了;而C++中,则由编译器替你做好了,不需程序员去做这些琐碎工作。

本文链接地址: http://www.redwolf-blog.com/?p=607

C++ 宏和模板简介

参考《21天学通C++》第14章节,对C++中的宏和模板进行了学习,总结起来其主要内容如下: (1) 预处理器简介 (2) 关键字#define与宏 (3) 模板简介 (4) 如何编写函数模板和模板类...
  • LG1259156776
  • LG1259156776
  • 2015年07月30日 11:44
  • 1596

C语言简单宏函数实现C++模板功能(类型本身作为函数参数)

//这里实现一个模板加 函数add
  • kimuwu
  • kimuwu
  • 2014年11月12日 15:53
  • 1313

函数式宏定义与普通函数的区别?C语言宏定义和宏定义函数 ?

http://www.jb51.net/article/41869.htm 尽管函数式宏定义和普通函数相比有很多缺点,但只要小心使用还是会显著提高代码的执行效率,毕竟省去了分配和释放栈帧、传参、...
  • changyourmind
  • changyourmind
  • 2016年12月15日 09:42
  • 3667

C语言宏定义和宏定义函数

要写好C语言,漂亮的宏定义是非常重要的。宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等。   在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成...
  • bytxl
  • bytxl
  • 2015年05月26日 14:51
  • 8701

C++模板:函数模板和模板函数

1.函数模板的声明和模板函数的生成 1.1函数模板的声明 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计。它的最大特点是把函数使用的数据类型作为参数。 ...
  • BeyondHaven
  • BeyondHaven
  • 2009年05月20日 17:08
  • 122400

在 C 语言中实现模板函数的方法

在 C 语言中实现模板函数的方法: 各种用 C 语言实现的模板可能在使用形式上有所不同。 现以一个求和函数 Sum 为例,用 C++ Template 可写如下: template  R Sum(co...
  • whinah
  • whinah
  • 2004年06月07日 09:47
  • 7075

C++模板之函数模板

泛型编程 编写与类型无关的逻辑代码,是代码复用的一种手段。模板是泛型编程的基础 模板 代表一个函数家族,该函数与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本(它本身不是类或函...
  • ADDw1
  • ADDw1
  • 2017年03月18日 10:39
  • 435

Linux C/C++ 模板:函数模板

一、代码 #include #include using namespace std; //函数模板 template T min(T i, T j, T k) { if (i...
  • kanguolaikanguolaik
  • kanguolaikanguolaik
  • 2015年04月10日 23:55
  • 732

C++函数模板(function template)

C++提供了函数模板(function template)。所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。 凡是函数体相同...
  • oktears
  • oktears
  • 2014年03月30日 14:21
  • 3607

C语言中实现模板函数小结

    如果要写个函数支持多种数据类型,首先想到的就是C++的模板了,但是有时候只能用C语言,比如在linux内核开发中,为了减少代码量,或者是某面试官的要求…      考虑了一阵子后,就想到了qs...
  • immcss
  • immcss
  • 2011年05月10日 12:48
  • 9405
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C的宏定义实现模板函数——C的C++模板函数机制实现
举报原因:
原因补充:

(最多只允许输入30个字)