В Linux для этой задачи можно использовать сам C++ компилятор из состава gcc.
Команда будет выглядеть так:
cat file.cpp | cpp -E -undef -fpreprocessed -dDI | tail -n+2
Дополнительная команды tail удаляет первую строку из вывода, так как ее добавляет компилятор cpp в процессе очистки исходного кода *.cpp-файла. Обычно в этой строке написано откуда получен входной поток, и эта строка выглядит вот так:
# 1 "<stdin>"
- именно она и удаляется.
В результате получается чистый исходный файл, в котором нет ни одного комментария, причем удаляются и однострочные комментарии, написанные синтаксисом //, и многострочные комментарии, которые имеют синтаксис /* ... */.