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语言中实现模板函数小结

    如果要写个函数支持多种数据类型,首先想到的就是C++的模板了,但是有时候只能用C语言,比如在linux内核开发中,为了减少代码量,或者是某面试官的要求…      考虑了一阵子后,就想到了qs...
  • immcss
  • immcss
  • 2011年05月10日 12:48
  • 8802

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

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

“标准”宏与函数模板

1.写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。 #define MIN(A,B) ((A) 这个测试是为下面的目的而设的: 1). 标识#define在宏中应用的...

C++ 宏和模板简介

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

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

用宏模拟C++模板的方法1

用宏模拟C++模板的方法1 /// @file ClassroomExamples.c /// @brief 用宏模拟C++模板的方法1 /** 用宏模拟C++模板 C语言中, 合法函数名或变量名...

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

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

c语言用宏实现模板-以队列为例

1. 队列类型及操作的宏定义://队列类型表示:Queue_元素类型(如元素为整形的队列类型为:Queue_int)//_ET:元素类型#define Q_TYPE(_ET) Queue_##_ET/...
  • immcss
  • immcss
  • 2011年05月10日 12:46
  • 4981

走进C++程序世界----宏定义和内联函数及模板说明

1. 简单宏定义     简单的宏定义有如下格式:   [#define指令(简单的宏)]  #define  标识符替换列表   替换列表是一系列的C语言记号,包括标识符、关键字、数、...

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数。 1.   最基本的算法是,从小到大遍历: for (i = 2 to A -1)          if (i * B > A)...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C的宏定义实现模板函数——C的C++模板函数机制实现
举报原因:
原因补充:

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