Использование clang или g++/gcc для печати предварительно обработанного кода без включения файлов из системных путей
В настоящее время я бы хотел отладить свои включения. Для этого я хочу получить предварительно обработанный код, но без файлов системных заголовков - только мой собственный код.
Я пробовал с флагом "-E"
а также "-nostdinc"
. Но тогда я получаю ошибки, например<string>
пропал, отсутствует. Как отключить такие ошибки предварительной обработки?
3 ответа
(На самом деле это не ответ - просто "взлом")
Чтобы решить эту проблему, я создал текстовый файл со всеми системными заголовками:
rem my GCC STL-PATH
cd Z:\usr\include\c++\10
dir /b > F:\DummySTL\files.txt
Затем я выполнил следующую строку кода:
for /f "delims=" %F in (files.txt) do copy nul "%F"
Это создает пустой текстовый файл для каждой строки в файле. Теперь я могу вызвать gcc или clang просто с помощью:
-isystem"F:\DummySTL"
Использование clang или g++/gcc для печати предварительно обработанного кода без включения файлов из системных путей
Это нелегко сделать с GCC. Прочтите о том, как вызвать GCC.
Но вы можете получить весь предварительно обработанный код, используяg++ -C -E
и используйте какой-нибудь скрипт (возможно, с GNU gawk) для удаления ненужных частей. Например, см. RefPerSys.
в настоящее время я бы хотел отладить свои включения.
У меня есть привычка генерировать весь предварительно обработанный код, а затем меньше использовать GNU, чтобы заглянуть внутрь него. Место на диске дешевое.
В качестве альтернативы подумайте о написании собственного плагина GCC, который сделает то, что вам нужно.
Как отключить такие ошибки предварительной обработки?
Вы можете создать набор файлов заголовков с именами, соответствующими заголовкам стандартной библиотеки. Поместите эти заголовки в каталог include. Пусть файлы будут пустыми.
Использование clang или g++/gcc для печати предварительно обработанного кода без включения файлов из системных путей
Я вижу два других подхода, помимо подхода с пустым заголовком:
Вместо использования полного препроцессора компилятора напишите свой собственный препроцессор, который выполняет только ту часть обработки, которую вы хотите.
Или напишите пост-препроцессор, который удаляет стандартное содержимое заголовка из предварительно обработанного результата.