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





Компилятор 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.
Создается во время компиляции, или связывание (если вы (можете) использовать экспорт)
Это зависит от компилятора - препроцессор работает как бы на отдельном этапе, но не обязательно, чтобы это была отдельная программа.
Обратите внимание, что / E в VC++ расширяет только операторы препроцессора (то есть #include, #ifdef, #define и т. д.)
Я не знаю ни одного современного компилятора, позволяющего расширять шаблоны.
Компиляторам легко добавить возможность показывать результат после подстановки макроса. В любом случае это определяется как вариант простой замены текста. Многие компиляторы реализуют это как отдельный этап, иногда даже как отдельный инструмент. В любом случае результатом подстановки макроса является набор единиц перевода в текстовой форме.
С другой стороны, шаблоны компилируются. Для этого есть несколько этапов. Например, имена разрешаются дважды. На любом этапе компилятор сохранит результат поиска имени. Это запись в таблице. Как бы вы показали это в текстовой форме? Для этого нет тривиального выражения C++.
Обратите внимание, что вопрос также касается расширения шаблона, а выбранный ответ не дает ответа на этот вопрос.