C语言实现模版

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

结论

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

  • 17
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是C语言实现模板匹配SSDA算法的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #define WIDTH 640 #define HEIGHT 480 // 计算两个像素点之间的欧几里得距离 double euclidean_distance(unsigned char *image, int x1, int y1, int x2, int y2) { double sum = 0; for (int i = 0; i < 3; i++) { double diff = image[(y1 * WIDTH + x1) * 3 + i] - image[(y2 * WIDTH + x2) * 3 + i]; sum += diff * diff; } return sqrt(sum); } // 计算两个像素点之间的相似度 double similarity(unsigned char *image, int x1, int y1, int x2, int y2) { double distance = euclidean_distance(image, x1, y1, x2, y2); return exp(-distance); } // 计算两个图像之间的相似度 double ssda(unsigned char *image1, unsigned char *image2, int x, int y, int w, int h) { double sum = 0; for (int i = 0; i < w; i++) { for (int j = 0; j < h; j++) { double sim = similarity(image1, x + i, y + j, i, j); sum += sim; } } return sum; } int main() { unsigned char *image = (unsigned char *)malloc(WIDTH * HEIGHT * 3); unsigned char *template = (unsigned char *)malloc(100 * 100 * 3); // 读取图像和模板 // ... double max_similarity = 0; int max_x = 0, max_y = 0; for (int x = 0; x < WIDTH - 100; x++) { for (int y = 0; y < HEIGHT - 100; y++) { double sim = ssda(image, template, x, y, 100, 100); if (sim > max_similarity) { max_similarity = sim; max_x = x; max_y = y; } } } printf("Max similarity: %f\n", max_similarity); printf("Position: (%d, %d)\n", max_x, max_y); free(image); free(template); return 0; } ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值