Spec-Zone.ru › GCC 11

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

3.23 Модули C++ ¶

Модули — это функция языка C++20. Как следует из названия, они предоставляют модульную систему компиляции, призванную обеспечить как более быструю сборку, так и лучшую изоляцию библиотек. Статья «Слияние модулей» https://wg21.link/p1103 содержит наиболее просто читаемый набор изменений стандарта, хотя не охватывает последующих изменений. Этот стандарт теперь является частью C++20, git@github.com:cplusplus/draft.git, и считается полным (могут появиться сообщения об ошибках).

Поддержка модулей в 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.

  • Карта модулей
  • Препроцессирование модулей
  • Скомпилированный интерфейс модуля

Примечания

(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-11.4.0/gcc/C_002b_002b-Modules.html

Spec-Zone.ru

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