3.23.2 Предварительная обработка модулей ¶
Модули влияют на предварительную обработку из-за единиц заголовков и перевода включений. Некоторые использования препроцессора как отдельного шага либо не производят правильного результата, либо требуют доступности CMIs.
Единицы заголовков импортируют макросы. Эти макросы могут влиять на последующее условное включение, которое, следовательно, может привести к различным наборам импортов. При предварительной обработке необходимо загрузить CMI. Если единица заголовка недоступна, препроцессор выводит предупреждение и продолжает выполнение (при отсутствии просто предварительной обработки генерируется ошибка). Обнаружение таких импортов требует токенизации входного потока препроцессором до 4-й фазы (расширения макросов).
Перевод включений преобразует директивы #include, #include_next и #import во внутренние объявления import. Перевод конкретной директивы контролируется модульным маппером. Имена единиц заголовков канонизируются во время предварительной обработки.
Информация о зависимостях может быть выведена для импорта макросов, расширяя функциональность опций -MD и -MMD. Обнаружение объявлений импорта также требует предварительной обработки на 4-й фазе и, следовательно, требует полной предварительной обработки (или компиляции).
Опции -M, -MM и -E -fdirectives-only останавливают предварительную обработку до 4-й фазы.
Опция -save-temps использует -fdirectives-only для предварительной обработки и сохраняет определения макросов в выводе предварительной обработки. Обычно вы также хотите использовать эту опцию при явной предварительной обработке единицы заголовка или при использовании такого обработанного вывода:
g++ -fmodules-ts -E -fdirectives-only my-header.hh -o my-header.ii g++ -x c++-header -fmodules-ts -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-11.4.0/gcc/C_002b_002b-Module-Preprocessing.html