Почему бы просто не использовать препроцессор c для этого? Почему вы ограничиваетесь доморощенным регулярным выражением?
[Edit] Этот подход также корректно обрабатывает сценарий Бартса printf(".../*...")
Пример:
[File: t.c]
/* This is a comment */
int main () {
/*
* This
* is
* a
* multiline
* comment
*/
int f = 42;
/*
* More comments
*/
return 0;
}
.
$ cpp -P t.c
int main () {
int f = 42;
return 0;
}
Или вы можете удалить пробел и сжать все
$ cpp -P t.c | egrep -v "^[ \t]*$"
int main () {
int f = 42;
return 0;
}
Нет смысла заново изобретать колесо?
[Изменить]
Если вы хотите , а не расширять включенные файлы и макросы с помощью этого подхода, cpp
предоставляет для этого флаги. Рассмотрим:
[Файл: t.c]
#include <stdio.h>
int main () {
int f = 42;
printf(" /* ");
printf(" */ ");
return 0;
}
.
$ cpp -P -fpreprocessed t.c | grep -v "^[ \t]*$"
#include <stdio.h>
int main () {
int f = 42;
printf(" /* ");
printf(" */ ");
return 0;
}
Там означает небольшого предостережения в том, что расширения макроса можно избежать, но исходное определение макроса удалено из источника.