首页 > 解决方案 > 如何自动重构 C for 循环

问题描述

我有一个非常大的旧代码库,我正在慢慢更新。

在大部分代码中,有一些for loops基本的数学例程,我想回调一个函数,即改变

for(int i=0;i< NUM_EL; i++)
{
   x[i] = a[i] * b[i];
}

vector_multiply(a,b,x,NUM_EL);

vector_multiply 的原型在哪里

void vector_multiply(const double *a, const double * b, double *x, int num_el);

是否有任何东西可以扫描您的源代码并将标准数学运算转换为回调例程?

更具体地说,会更改您的代码以自动在您的代码中进行 blas 回调吗?

我猜我可以使用 libclang 来做到这一点。

标签: crefactoringautomated-refactoringlibclang

解决方案


我不相信这可以在没有引入错误的可能性的情况下全自动完成。

但是,您可以使用 perl 脚本并手动查看更改。

perl -0777 -pe 's/for\s*\(\s*int\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*=\s*0;\s*\1\s*<\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*;\s*\1\s*\+\+\s*\)\s*\{\s*([a-zA-Z_][a-zA-Z0-9_]*)\[\1\]\s*=\s*([a-zA-Z_][a-zA-Z0-9_]*)\[\1\]\s*\*\s*([a-zA-Z_][a-zA-Z0-9_]*)\[\1\]\s*;\s\}/vector_multiply(\4,\5,\3,\2);/igs' test.c

推荐阅读