Пусть кто-нибудь проголосует за мой собственный ответ на мой вопрос.
Благодаря идее Мартина Йорка я обнаружил, что в Visual Studio решение выглядит оченьпросто (подлежит дальнейшему тестированию).Просто переименуйте ВСЕ директивы препроцессора во что-то другое (что-то, что не является допустимым синтаксисом c ++, все в порядке) и используйте cl.exe с / P
cl target.cpp /P
, и он выдаст target.i
.И это содержит источник минус комментарии.Просто переименуйте предыдущие директивы обратно, и все.Возможно, вам потребуется удалить директиву #line
, сгенерированную cl.exe.
Это работает, потому что в соответствии с MSDN этапы перевода таковы:
Отображение символов Символы в исходном файле сопоставляются с внутренним исходным представлением.Последовательности триграфов на этом этапе преобразуются во внутреннее односимвольное представление.
Сращивание строк Все строки, заканчивающиеся обратной косой чертой () и сразу после символа новой строки объединяются со следующей строкой висходный файл, формирующий логические строки из физических строк.Если он не пуст, исходный файл должен заканчиваться символом новой строки, которому не предшествует обратная косая черта.
Токенизация Исходный файл разбивается на токены предварительной обработки и символы пробела.Комментарии в исходном файле заменяются одним пробелом каждый.Символы новой строки сохраняются.
Предварительная обработка Директивы предварительной обработки выполняются, и макросы расширяются в исходный файл.Оператор #include вызывает перевод, начинающийся с трех предыдущих шагов перевода любого включенного текста.
Отображение набора символов Все члены исходного набора символов и escape-последовательности преобразуются в их эквиваленты при выполнении.набор символов.Для Microsoft C и C ++ исходный и исполняющий наборы символов являются ASCII.
Конкатенация строк Все литералы смежных строк и широких строк объединяются.Например, «Строка» «Конкатенация» становится «Строка Конкатенация».
Перевод Все токены анализируются синтаксически и семантически;эти токены преобразуются в объектный код.
Связь Все внешние ссылки разрешаются для создания исполняемой программы или библиотеки динамических ссылок
Комментарии удаляются во время Токенизация до Предварительная обработка фаза.Поэтому просто убедитесь, что на этапе предварительной обработки ничего не доступно для обработки (без удаления всех директив), и его выходные данные должны быть такими же, как обработанные предыдущими 3 фазами.
Что касается пользовательских .h файлов,используйте параметр / FI, чтобы включить их вручную.Результирующий файл .i будет представлять собой комбинацию .cpp и .h.без комментариев.Каждому фрагменту предшествует строка # с правильным именем файла.Так что их легко разделить по редактору.Если мы не хотим разбивать их вручную, возможно, нам нужно использовать средства макросов / сценариев некоторых редакторов, чтобы сделать это автоматически.
Итак, теперь нам не нужно заботиться одирективы препроцессора.Еще лучше то, что обрабатывается символ продолжения строки (обратная косая черта).
Например,
// vc8.cpp : Defines the entry point for the console application.
//
-#include "stdafx.h"
-#include <windows.h>
-#define NOERR
-#ifdef NOERR
/* comment here */
whatever error line is ok
-#else
some error line if NOERR not defined
// comment here
-#endif
void pr() ;
int _tmain(int argc, _TCHAR* argv[])
{
pr();
return 0;
}
/*comment*/
void pr() {
printf(" /* "); /* comment inside string " */
// comment terminated by \
continue a comment line
printf(" "); /** " " string inside comment */
printf/* this is valid comment within line continuation */\
("some weird lines \
with line continuation");
}
После cl.exe vc8.cpp /P
он становится этим, а затем может быть снова передан cl.exe после восстановлениядирективы (и удаление #line)
#line 1 "vc8.cpp"
-#include "stdafx.h"
-#include <windows.h>
-#define NOERR
-#ifdef NOERR
whatever error line is ok
-#else
some error line if NOERR not defined
-#endif
void pr() ;
int _tmain(int argc, _TCHAR* argv[])
{
pr();
return 0;
}
void pr() {
printf(" /* ");
printf(" ");
printf\
("some weird lines \
with line continuation");
}