3.24.2 Предварительная обработка модулей
Модули влияют на предварительную обработку из-за единиц заголовков и преобразования включений. Некоторые способы использования препроцессора в качестве отдельного этапа либо не дают корректный результат, либо требуют наличия CMI.
Единицы заголовков импортируют макросы. Эти макросы могут влиять на последующее условное включение, что, в свою очередь, может привести к различающимся наборам импортов. При предварительной обработке необходимо загрузить CMI. Если единица заголовка недоступна, препроцессор выдаёт предупреждение и продолжает работу (если выполняется не только предварительная обработка, выдаётся ошибка). Для обнаружения таких импортов требуется токенизация входного потока препроцессором до фазы 4 (подстановки макросов).
Преобразование включений заменяет директивы #include, #include_next и #import внутренними объявлениями import. Преобразование конкретной директивы определяется сопоставителем модулей. Имена единиц заголовков приводятся к каноническому виду во время предварительной обработки.
Для импорта модулей можно формировать сведения о зависимостях, расширяя возможности различных параметров -M. Для обнаружения объявлений импорта требуется обработка директив препроцессора на фазе 4, но подстановка макросов не требуется, поэтому использовать -MD не нужно. Альтернативный формат сведений о зависимостях модулей см. также в описании -fdeps-*.
Для предварительной обработки параметр -save-temps использует -fdirectives-only и сохраняет определения макросов в предварительно обработанном выводе. Обычно этот параметр также следует использовать при явной предварительной обработке единицы заголовка или при использовании такого предварительно обработанного вывода:
g++ -fmodules -E -fdirectives-only my-header.hh -o my-header.ii g++ -x c++-header -fmodules -fpreprocessed -fdirectives-only my-header.ii
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/C_002b_002b-Module-Preprocessing.html