棘手 - 你将不得不为此解析 C 代码。结果必须有多接近?我的意思的例子:
int a, /* foo */
b, /* << the unused one */
c; /* bar */
现在,对人类来说很明显第二条评论必须删除。
轻微变化:
void test(/* in */ int a, /* unused */ int b, /* out */ int* c);
同样,第二条评论必须删除,这次是 b 之前的评论。
通常,您希望解析输入,过滤它,并发出不是未使用变量声明的所有内容。您的解析器必须保留注释和#include 语句,但如果您不使用#include 标头,则可能无法识别声明(如果使用宏来隐藏声明,则更是如此)。毕竟,您需要标题来决定是否 A * B(); 是函数声明(当 A 是类型时)或乘法(当 A 是变量时)
[编辑] 此外:
即使您知道某个变量未使用,删除它的正确方法在很大程度上取决于远程上下文。例如,假设
int foo(int a, int b, int c) { return a + b; }
显然,c 未被使用。可以改成吗?
int foo(int a, int b) { return a + b; }
也许,但如果 &foo 存储在 int a中,则不是int(*)(int,int,int)
。这可能发生在其他地方。如果(且仅当)发生这种情况,您应该将其更改为
int foo(int a, int b, int /*unused*/ ) { return a + b; }