重构2个具有不同参数但在c中实现几乎相同的函数
我有两个功能相似重构2个具有不同参数但在c中实现几乎相同的函数,c,function,refactoring,C,Function,Refactoring,我有两个功能相似 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
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 func1(info1*ari,int l,int r){
int size=sizeof\u char\u数组(ari->field\u类型);
用于(int i=0;i字段类型[i]&内存){
mem_info*mi=(mem_info*)ari->field[i];
mi->L=L;
}
否则如果。。。
否则{
info2*p=(info2*)ri->field[i];
函数2(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);
}
}
}
void func2(info2*ri,int l,int r){
int size=sizeof\u char\u数组(ri->field\u类型);
用于(int i=0;i字段类型[i]&内存){
mem_info*mi=(mem_info*)ri->field[i];
mi->L=L;
}
否则如果。。。
否则{
info2*p=(info2*)ri->field[i];
函数2(p,l,r);
}
}
}
很容易发现这两个函数之间的唯一区别是info1*
和info2*
info1
和info2
是具有类似布局的结构
有没有办法在C中把这两个函数优雅地重构成一个函数?不幸的是,C没有这样的机制。您可以使用宏生成两个函数,对类型进行参数化:
#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); \
} \
} \
}
如果fun1递归地调用自己呢@Vittorio@YuanWen:然后您只需将
func1(…)
的调用更改为name(…)
;这两个函数都调用func2
,而它们可能是递归的(因此func1
调用func1
,但func2
调用func2
)。func1
中还出现了info2
的问题-也不清楚这是否正确。请注意,您的func1
不是递归的(它调用func2
);您的func2
是递归的(它自己调用)。这是问题中的错别字吗?片段还使用了info2
和一个cast。这真的是你想要的吗?如果是,则函数之间的差异很大,远远超过要编辑的字符数。是的,func2会调用自身。该片段使用info2@乔纳坦利弗勒
DEFINE_FUNC(func1, info1)
DEFINE_FUNC(func2, info2)
#undef DEFINE_FUNC
int main()
{
func1(some_info1, 0, 5);
func2(some_info2, 1, 6);
}