Spec-Zone.ru › GCC 12

3.23 Модули C++

Модули — это функция языка C++20. Как следует из названия, они предоставляют модульную систему компиляции, призванную обеспечить как более быструю сборку, так и лучшую изоляцию библиотек. Статья «Объединение модулей» https://wg21.link/p1103 предоставляет наиболее легко читаемый набор изменений в стандарт, хотя он не отражает более поздние изменения.

Поддержка модулей G++ неполная. Помимо ошибок, известные отсутствующие компоненты:

Частный фрагмент модуля

Частный фрагмент модуля распознаётся, но выдаётся ошибка.

Правила видимости определения разделов

Сущности могут быть определены в разделах реализации, и эти определения недоступны за пределами модуля. Это не реализовано, и определения доступны для использования вне модуля.

Текстовое объединение достижимых сущностей GM

Сущности могут быть многократно определены в разных единицах заголовков. Их необходимо дедуплицировать, и это реализовано для импортов или когда импорт переопределяет текстово определённую сущность. Однако обратное не реализовано — текстовое переопределение сущности, которая уже определена в импортированной единице заголовка. Выдаётся ошибка переопределения.

Правила ссылки на единицу трансляции

Статьи p1815 (https://wg21.link/p1815) и p2003 (https://wg21.link/p2003) добавляют ограничения на то, на какие сущности может ссылаться экспортируемая область (например, на какие сущности может ссылаться экспортируемое определение шаблона). Они не полностью реализованы.

Присоединение модуля языковой связи

Декларации с явным языковым связыванием (extern "C" или extern "C++") прикрепляются к глобальному модулю, даже когда находятся в рамках именованного модуля. Это не реализовано. Такие декларации будут прикреплены к модулю, если таковой имеется, в котором они объявлены.

Единицы заголовков стандартной библиотеки

Стандартная библиотека не предоставляется как импортируемые единицы заголовков. Если вы хотите импортировать такие единицы, вы должны сначала их явно скомпилировать. Если вы этого не сделаете с осторожностью, у вас может быть несколько деклараций, которые механизм модулей должен объединить — использование ресурсов компилятора может быть затронуто тем, как вы разбиваете файлы заголовков на единицы заголовков.

Модульная компиляция не включается только с помощью опции -std=c++20. Необходимо явно включить её с помощью опции -fmodules-ts. Она независима от выбранной версии языка, хотя в версиях до C++20 она, конечно, является расширением.

Новые постфиксы для файлов исходников не требуются и не поддерживаются. Если вы хотите использовать нестандартный постфикс (см. Общие опции), вам также необходимо указать опцию -x c++.2

Компиляция единицы интерфейса модуля производит дополнительный вывод (в дополнение к файлам ассемблера или объектных файлов), называемый Компилированный интерфейс модуля (CMI). В нём закодированы экспортируемые декларации модуля. Импорт модуля считывает CMI. Граф импорта — ориентированный ациклический граф (DAG). Вы должны скомпилировать импорты перед импортером.

Файлы заголовков могут быть скомпилированы в единицы заголовков, что является переходной возможностью, направленной на ускорение компиляции. Для включения этой возможности используется опция -fmodule-header, которая подразумевает опцию -fmodules-ts. Эти CMI называются полным разрешённым базовым файлом заголовка и, следовательно, могут быть полным путём с подкаталогами. Если файл заголовка находится по абсолютному пути, местоположение CMI всё равно относительно корневого каталога CMI.

Поскольку файлы заголовков часто не имеют постфикса, вам обычно приходится указывать опцию -x, чтобы сообщить компилятору, что исходный файл — файл заголовка. Вы можете использовать -x c++-header, -x c++-user-header или -x c++-system-header. При использовании в сочетании с -fmodules-ts все они подразумевают соответствующую опцию -fmodule-header. Последние два варианта используют путь включения пользователя или системы для поиска указанного файла. Это позволяет, например, компилировать файлы заголовков стандартной библиотеки в качестве единиц заголовков без необходимости знать их точное расположение. Указание языка как одного из этих вариантов также препятствует выводу объектного файла, так как у файлов заголовков нет связанного объектного файла.

Опция -fmodule-only отключает создание связанного объектного файла для компиляции интерфейса модуля. Генерируется только CMI. Эта опция подразумевается при использовании опции -fmodule-header.

Опции -flang-info-include-translate и -flang-info-include-translate-not указывают, происходит ли перевод включений или нет. Без аргумента первая укажет все переводы включений. Вторая укажет все непереводы файлов включений, не известные как намеренно текстовые. С аргументом запрашивается информация о переводе включений для файлов заголовков с этим постфиксом. Вы можете повторять этот формат, чтобы охватить несколько различных файлов заголовков. Эта опция может быть полезной для определения того, происходит ли перевод включений — если он работает правильно, он ведёт себя так, как будто его вообще нет.

Опция -flang-info-module-cmi может быть использована для определения, откуда компилятор считывает CMI. Без этой опции компилятор молчит, когда такое чтение проходит успешно. Эта опция имеет необязательный аргумент, который ограничит уведомление только набором указанных именованных модулей или единиц заголовков.

Опция -Winvalid-imported-macros заставляет все импортированные макросы разрешаться в конце компиляции. Без этого импортированные макросы разрешаются только при расширении или (повторном) определении. Эта опция обнаруживает конфликтующие определения импорта для всех макросов.

Подробная информация о семействе опций -fmodule-mapper доступна в разделе C++ Модульный Маппер.

• C++ Модульный Маппер: Модульный Маппер
• C++ Предварительная обработка модулей: Предварительная обработка модулей
• C++ Компилированный интерфейс модуля: Компилированный интерфейс модуля

Примечания

(2)

Некоторые пользователи предпочитают различать файлы интерфейса модулей с новым постфиксом, например, называя исходный файл module.cppm, что предполагает обучение всех инструментов новому постфиксу. Другая схема, такая как название module-m.cpp, была бы менее инвазивной.

Предыдущее: Предварительно скомпилированные заголовки, Верхний уровень: Вызов GCC [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/C_002b_002b-Modules.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API