📤 export: что именно вы отдаёте наружу?

Из модуля наружу видно только то, что помечено export. Всё остальное снаружи не видно — но это не «закрытость» уровня файла: у непомеченных сущностей модульное связывание, то есть их видят другие единицы трансляции того же модуля, просто не видит код, который подключает модуль. Это противоположность заголовкам, где в чужой код текстуально попадает вообще всё.

export module geometry;

export struct Point { double x, y; }; // открыто наружу

double dist(Point a, Point b); // скрыто снаружи,
// но доступно внутри модуля

export double length(Point p) { // открыто наружу
return dist(p, {0, 0});
}

Открыть наружу можно почти любую сущность: функции, типы, шаблоны, переменные, псевдонимы using.


🪐 Удобные формы записи



export { // блок экспорта
int foo();
int bar();
}

export namespace net { // только объявления ЭТОГО блока
void connect();
}

export import utils; // повторный экспорт: проброс
// чужого модуля дальше

❗️ export namespace открывает только то, что объявлено в этом блоке. Если позже снова открыть пространство имён net без export, новые имена наружу не уйдут.


❌ Ошибки

• export допустим только в единице, которая начинается с export module …;. В единице реализации (module geometry; без export) это ошибка компиляции
• export нельзя ставить на сущности в безымянном пространстве имён — у них внутреннее связывание
• функцию со static не открыть — она по определению локальна (внутреннее связывание)
• нельзя открывать что-либо из общей вступительной части модуля (того, что идёт до export module …;)
Просмотры: 164
Открыть в MAX Сообщить о неточности

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти