C语言实现模版

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

http://blog.csdn.net/zoomdy/article/details/79242528
mingdu.zheng at gmail dot com

C++的实现

template 

T add(T a, T b)
{
  return a + b;
}

#include 

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 

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

结论

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

你可能感兴趣的:(嵌入式软件,C)