Tricky - для этого вам придется проанализировать код 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(*)(int,int,int)
. И это может случиться где-то еще. Если (и только если) это произойдет, вы должны изменить его на
int foo(int a, int b, int /*unused*/ ) { return a + b; }