0
点赞
收藏
分享

微信扫一扫

C语言实现模版

boomwu 2022-11-20 阅读 64


C语言有两把双刃剑,一把是“指针”,另一把是“宏”。这回咱就用“宏”来实现C++中才有的模版。这里的模版实现一个很简单的加法函数,同一个函数代码可以处理不同类型的加法运算。

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;
}

结论

“宏”是一把双刃剑,用得好那是“削铁如泥”,用得不好就是“挥刀自宫”。


举报

相关推荐

0 条评论