use*_*514 9 c automated-refactoring
我想从C文件中删除未使用的局部变量.例:
int fun(int a , int b)
{
int c,sum=0;
sum=a + b;
return sum;
}
Run Code Online (Sandbox Code Playgroud)
这里未使用的变量是'c'.
我将从外部获得所有未使用的局部变量的列表.现在使用我所拥有的未使用的局部变量,我们必须从源代码和删除中找到局部变量.
在上面的例子中,"c"是未使用的变量.我会知道它(我有代码).在这里,我必须找到c并删除它.
编辑
关键是不要使用外部工具查找未使用的局部变量.关键是要从给定列表的代码中删除它们.
Pau*_*ham 21
打开你的编译器警告级别,它应该告诉你.
将源片段放在"fc"中:
% gcc -c -Wall f.c
f.c: In function 'fun':
f.c:1: warning: unused variable 'c'
Run Code Online (Sandbox Code Playgroud)
MSa*_*ers 10
棘手 - 你必须为此解析C代码.结果有多接近?我的意思是:
int a, /* foo */
b, /* << the unused one */
c; /* bar */
Run Code Online (Sandbox Code Playgroud)
现在,人类很明显第二条评论必须要去.
轻微变化:
void test(/* in */ int a, /* unused */ int b, /* out */ int* c);
Run Code Online (Sandbox Code Playgroud)
再次,第二个评论必须去,这次是b之前的评论.
通常,您希望解析输入,过滤它,并发出不是未使用变量声明的所有内容.您的解析器必须保留注释和#include语句,但如果您没有#include标头,则可能无法识别声明(如果使用宏来隐藏声明,则更是如此).毕竟,你需要标题来决定是否A*B(); 是函数声明(当A是类型时)或乘法(当A是变量时)
[编辑]此外:
即使您知道变量未使用,删除它的正确方法也很大程度上取决于远程上下文.例如,假设
int foo(int a, int b, int c) { return a + b; }
Run Code Online (Sandbox Code Playgroud)
显然,c未被使用.你能改成吗?
int foo(int a, int b) { return a + b; }
Run Code Online (Sandbox Code Playgroud)
也许,但不是如果&foo存储在一个int(*)(int,int,int).这可能发生在其他地方.如果(且仅当)发生这种情况,您应该将其更改为
int foo(int a, int b, int /*unused*/ ) { return a + b; }
Run Code Online (Sandbox Code Playgroud)
你为什么要这样做?假设你有一个像样的优化编译器(GCC时,Visual Studio等)的二进制输出将不会有任何不同是否需要在删除"廉政C"在你的原来的例子与否.
如果这只是代码清理,任何最新的IDE都会为您提供每个警告的源代码的快速链接,只需单击并删除:)
我的回答更多是对MSalters非常彻底的回答的精心评论.我会超越'棘手'并说这样的工具既不可能也不可取.
如果您只想删除对变量的引用,那么您可以编写自己的代码解析器,但是需要区分它所在的函数上下文,例如
int foo(double a, double b)
{
b = 10.0;
return (int) b;
}
int bar(double a, double b)
{
a = 5.00;
return (int) a;
}
Run Code Online (Sandbox Code Playgroud)
任何简单的解析器都会遇到麻烦,'a'和'b'都是未使用的变量.
其次,如果您将评论视为MSalter,您会发现人们不会持续评论;
double a;
/*a is designed as a dummy variable*/
double b;
/*a is designed as a dummy variable*/
double a;
double b;
double a; /*a is designed as a dummy variable*/
double b;
Run Code Online (Sandbox Code Playgroud)
等等
因此,简单地删除未使用的变量将创建孤立的评论,这可能比没有评论更危险.
最终,优雅地执行是一项非常困难的任务,无论如何你都会破坏代码.通过自动化流程,您可能会使代码变得更糟.
最后,您应该首先考虑变量在代码中的原因,如果它们被弃用,为什么它们的所有引用都不会被删除.