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

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

Есть предположения?

Обратите внимание, что вопрос также касается расширения шаблона, а выбранный ответ не дает ответа на этот вопрос.

TripShock 26.04.2012 22:23
Связанный вопрос имеет более полезный (хотя и специфичный для gcc) ответ. Чтобы получить более высокоуровневый код, подобный C++, чем RTL, используйте семейство опций -fdump-tree-..., например -fdump-tree-gimple, вместо предложенных в этом ответе -fdump-rtl-....
Ruslan 27.05.2015 16:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
12
2
5 319
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

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

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

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

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

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

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

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

Создается во время компиляции, или связывание (если вы (можете) использовать экспорт)

MSalters 22.01.2009 17:33

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

Jonathan Leffler 08.02.2009 10:00

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

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

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

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

Другие вопросы по теме