重构器2具有不同的参数,但在c中的实现几乎相同

时间:2017-07-07 08:32:05

标签: 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->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*info1info2是具有相似布局的结构。

有没有办法在C中优雅地将这两个函数重构为一个?

1 个答案:

答案 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);
}