Просмотр расширенного кода компилятора - C ++ - PullRequest
11 голосов
/ 20 января 2009

Я узнал, что компилятор будет расширять макросы во время компиляции. Шаблоны также раскрываются во время компиляции. Есть ли способ увидеть этот расширенный код? Я компилирую с использованием Visual Studio 2008.

есть мысли?

Ответы [ 5 ]

10 голосов
/ 20 января 2009

Компилятор VC ++ (cl.exe) поддерживает несколько параметров командной строки для этого:

/E preprocess to stdout
/P preprocess to file
/EP preproscess to stdout with no #lines

Дополнительные параметры командной строки могут быть добавлены в свойствах вашего проекта. В моей версии (VC2005) Параметры конфигурации -> C / C ++ -> Командная строка -> Дополнительные параметры

9 голосов
/ 20 января 2009

Компилятор на самом деле не выполняет никаких расширений макросов. Это задача препроцессора. Все это выглядит как один шаг, но компилятор фактически выполняет отдельные задачи препроцессора и перехватывает вывод для вас.

Шаблоны не «раскрываются» во время компиляции. Они создаются при использовании во время компиляции. Разница в том, что компилятор сразу генерирует объектный код для шаблона; нет промежуточного исходного кода, который выходит. Вы не можете рассматривать созданный экземпляр шаблона как исходный код, он выгружается как сборка, когда это необходимо.

Если у вас есть GCC, вы также можете напрямую вызывать препроцессор, используя 'cpp' с правильными аргументами (в основном это пути и определения макросов командной строки). Другие ответили на MSVC.

5 голосов
/ 20 января 2009

Обратите внимание, что / E в VC ++ расширяет только операторы препроцессора (то есть #include, #ifdef, #define и т. Д.)

Я не знаю ни одного современного компилятора, который бы позволял расширять шаблоны.

2 голосов
/ 20 января 2009

Чтобы выдать предварительно обработанный код, вызовите cpp напрямую или используйте опцию -E в gcc и связанных компиляторах; Я уверен, что другие компиляторы или комплекты имеют подобные вещи (действительно, согласно другому ответу это / E или / P в VC ++).

Не уверен насчет вывода созданных шаблонов. Думаю, это сделать гораздо сложнее, поскольку это на самом деле часть компиляции, а не предварительной обработки (по крайней мере, в современных компиляторах, поскольку исходная версия cfront, которая была переводчиком с ++-to-c, если я правильно помню).

1 голос
/ 22 января 2009

Легко добавить опцию в компиляторы, чтобы показать выходные данные после замены макроса. В любом случае это определяется как опция простого замещения текста. Многие компиляторы реализуют это как отдельный этап, иногда даже обрабатывается как отдельный инструмент. В любом случае результатом подстановки макроса является набор единиц перевода в текстовой форме.

Шаблоны, с другой стороны, компилируются. Есть несколько этапов к этому. Например, имена разрешаются дважды. На любом этапе компилятор сохранит результат поиска по имени. Это запись в таблице. Как бы вы показали это в текстовом виде? Для этого нет простого выражения C ++.

...