ytgui / temp

0 stars 0 forks source link

Generic for pure C #66

Closed ytgui closed 5 years ago

ytgui commented 5 years ago

https://zhuanlan.zhihu.com/p/34496542

产生一种类型

#define Vector_(NAME) Num ## Vector_ ## NAME
#define Vector Num ## Vector

#define num float
#define Num Float

struct Vector
{
 num *data;
 int n;
};

void Vector_(add)(Vector *C, Vector *A, Vector *B)
{
  // do something
}

产生多类型

#define CONCAT_2_EXPAND(A, B) A ## B
#define CONCAT_2(A, B) CONCAT_2_EXPAND(A, B)
#define CONCAT_3_EXPAND(A, B, C) A ## B ## C
#define CONCAT_3(A, B, C) CONCAT_3_EXPAND(A, B, C)

#define Vector_(NAME) CONCAT_3(Num, Vector_, NAME)
#define Vector CONCAT_2(Num, Vector)

#define num float
#define Num Float
struct Vector
{
 num *data;
int n;
};

void Vector_(add)(Vector *C, Vector *A, Vector *B)
{
//codes
}
#undef num
#undef Num

#define num double
#define Num Double
struct Vector
{
 num *data;
 int n;
};

void Vector_(add)(Vector *C, Vector *A, Vector *B)
{
//codes
}
#undef num
#undef Num

消除重复代码

#include "general.h"

#define Vector_(NAME) CONCAT_3(Num, Vector_, NAME)
#define Vector CONCAT_2(Num, Vector)

#define num float
#define Num Float
#include "generic/add.h"
#undef num
#undef Num

#define num double
#define Num Double
#include "generic/add.h"
#undef num
#undef Num