Просмотр расширенного кода компилятора - С++

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

любые мысли?

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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