我有两个相似的功能,
void func1(info1* ari,int l,int r) {
int size = sizeof_char_array(ari->field_type) ;
for (int i=0 ; i<size ; i++) {
if (ari->field_type[i] & MEMORY) {
mem_info* mi = (mem_info*)ari->field[i] ;
mi->L = l ;
}
else if ...
else {
info2* p = (info2*)ri->field[i] ;
func2(p,l,r);
}
}
}
另一个是
void func2(info2* ri,int l,int r) {
int size = sizeof_char_array(ri->field_type) ;
for (int i=0 ; i<size ; i++) {
if (ari->field_type[i] & MEMORY) {
mem_info* mi = (mem_info*)ri->field[i] ;
mi->L = l ;
}
else if...
else {
info2* p = (info2*)ri->field[i] ;
func2(p,l,r);
}
}
}
很容易发现这两个函数之间的唯一区别是info1*
和info2*
。 info1
和info2
是具有相似布局的结构。
有没有办法在C中优雅地将这两个函数重构为一个?
答案 0 :(得分:3)
不幸的是,C没有类似C++'s templates的机制。您可以使用宏来生成两个函数,参数化类型:
#define DEFINE_FUNC(name, type) \
void name(type* ari, int l, int r) \
{ \
int size = sizeof_char_array(ari->field_type); \
for(int i = 0; i < size; i++) \
{ \
if(ari->field_type[i] & MEMORY) \
{ \
mem_info* mi = (mem_info*)ari->field[i]; \
mi->L = l; \
} \
else if \
{ /* ... */ \
} \
else \
{ \
info2* p = (info2*)ri->field[i]; \
func2(p, l, r); \
} \
} \
}
然后您可以定义您的功能并按如下方式使用它们:
DEFINE_FUNC(func1, info1)
DEFINE_FUNC(func2, info2)
#undef DEFINE_FUNC
int main()
{
func1(some_info1, 0, 5);
func2(some_info2, 1, 6);
}