Процесс компиляции C ++: место для шаблонов - PullRequest
0 голосов
/ 16 ноября 2018

Я изучаю процесс компиляции C ++.Читая этот пост , я начал копать глубже.Во-первых, препроцессор выполняет свою работу, и он разрешает все директивы препроцессора.В моей реализации g ++ (GNU) #import <iostream> расширен до 18 тыс. Строк исходного кода.

Тем не менее, вышеупомянутый пост переходит к объяснению процесса синтаксической проверки C ++, то есть стадии компиляции, которая переводитчистый код C ++ для архитектурно-зависимого ассемблера.

Однако до этого шага перевода я все еще вижу много шаблонных определений.Есть ли шаг до перевода в сборку, в котором создаются все шаблоны?

Я знаю, что могу поручить g ++ выполнять только предварительную обработку (опция -E), но могу ли я затем проинструктировать g ++взять чистый файл C ++ без каких-либо директив предварительной обработки и создать файл C ++ со всеми разрешенными шаблонами?

1 Ответ

0 голосов
/ 16 ноября 2018

Есть ли шаг до перевода в сборку, в котором разрешаются все шаблоны?

Нет, такого отдельного шага не существует.Код шаблона может зависеть от кода, не являющегося шаблоном, и наоборот, поэтому они обрабатываются вместе.Код шаблона также не указан, чтобы иметь какой-либо эквивалентный не шаблонный код в стандарте C ++.Хотя можно придумать такую ​​эквивалентность шаблонов и шаблонов, современные компиляторы обычно переводят шаблоны непосредственно в какое-то внутреннее представление, а не в исходный код без шаблонов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...