有没有一个工具可以正确地重构这个C代码?

时间:2012-08-29 02:58:18

标签: c refactoring automated-refactoring

假设我有以下代码(数组*函数是我们用于可调整大小的数组的函数,它们在指向null的数组上进行初始化):

typedef struct MyStruct
{
    int i;
} MyStruct;

MyStruct* GetNewMyStruct(int i)
{
    MyStruct* s = malloc(sizeof(MyStruct));
    s->i = i;
    return s;
}

int SomeFunction(int number, MyStruct *elem)
{
    MyStruct **structs = NULL;
    int i;
    for (i = 0; i < number; i++)
        arrayPush(&structs, GetNewMyStruct(i));
    arrayPush(&structs, elem);
    return arraySize(&structs);
}

我认为SomeFunction太大了,我想重构它。目前我在哪里工作,我们使用VisualAssist X,它具有一些重构功能,但是当我在它上面使用它时,它无法正常工作。如果我试图用它来重构循环,这就是我得到的:

void MyMethod( int number, MyStruct ** structs ) 
{
    int i;
    for (i = 0; i < number; i++)
        arrayPush(&structs, GetNewMyStruct(i));
}

int SomeFunction(int number, MyStruct *elem)
{
    MyStruct **structs = NULL;
    MyMethod(number, structs);
    arrrayPush(&structs, elem);
    return arraySize(&structs);
}

这不正确。 MyMethod应该是MyStruct ***,而不是MyStruct **。这是因为我重构的代码采用structs的地址。结果是重构版本将始终返回1(因为只有一个对象已被推送到我的数组中)而不是number+1。还有其他工具可以正确地进行这种类型的重构吗?

1 个答案:

答案 0 :(得分:1)

Eclipse CDT正确执行此操作(至少是当前版本的Juno)。选择i的声明和循环并执行 Refactor&gt;提取函数,并将structs设置为输出参数,生成:

void MyMethod(int number, MyStruct*** structs) {
    int i;
    for (i = 0; i < number; i++)
        arrayPush(&*structs, GetNewMyStruct(i));
}

int SomeFunction(int number, MyStruct *elem)
{
    MyStruct **structs = NULL;
    MyMethod(number, &structs);
    arrayPush(&structs, elem);
    return arraySize(&structs);
}