重构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);
}