C语言有两把双刃剑,一把是“指针”,另一把是“宏”。这回咱就用“宏”来实现C++中才有的模版。这里的模版实现一个很简单的加法函数,同一个函数代码可以处理不同类型的加法运算。
http://blog.csdn.net/zoomdy/article/details/79242528
mingdu.zheng at gmail dot com
C++的实现
template <class T>
T add(T a, T b)
{
return a + b;
}
#include <stdio.h>
int main(int argc, const char *argv[])
{
int n;
float f;
char c;
n = add(8, 9);
f = add(3.2f, 8.7f);
c = add('Z', ' ');
printf("n = %d, f = %.1f, c = %c\n", n, f, c);
return 0;
}
C语言的实现
// add.h
// 定义算法函数
_type _func(_type a, _type b)
{
return a + b;
}
#undef _type
#undef _func
// add.c
// 定义add函数,实际上是宏
#define add(t, a, b) (add_ ## t ((a), (b)))
// 创建类型为int的实例函数
#define _type int
#define _func add_int
#include "add.h"
// 创建类型为char的实例函数
#define _type char
#define _func add_char
#include "add.h"
// 创建类型为float的实例函数
#define _type float
#define _func add_float
#include "add.h"
#include <stdio.h>
int main(int argc, const char *argv[])
{
int n;
float f;
char c;
// 引用add函数,第一个参数为类型
n = add(int, 8, 9);
f = add(float, 3.2f, 8.7f);
c = add(char, 'Z', ' ');
printf("n = %d, f = %.1f, c = %c\n", n, f, c);
return 0;
}
预处理结果
使用gcc -E add.c输出预处理结果,实际上定义了三个函数,main函数中分别调用了不同的函数。(下面的预处理结果删除了stdio.h头文件的部分)
# 1 "add.h" 1
int add_int(int a, int b)
{
return a + b;
}
# 7 "add.c" 2
# 1 "add.h" 1
char add_char(char a, char b)
{
return a + b;
}
# 11 "add.c" 2
# 1 "add.h" 1
float add_float(float a, float b)
{
return a + b;
}
# 15 "add.c" 2
int main(int argc, const char *argv[])
{
int n;
float f;
char c;
n = (add_int ((8), (9)));
f = (add_float ((3.2f), (8.7f)));
c = (add_char (('Z'), (' ')));
printf("n = %d, f = %.1f, c = %c\n", n, f, c);
return 0;
}
结论
“宏”是一把双刃剑,用得好那是“削铁如泥”,用得不好就是“挥刀自宫”。