📤 export: что именно вы отдаёте наружу?
Из модуля наружу видно только то, что помечено export. Всё остальное снаружи не видно — но это не «закрытость» уровня файла: у непомеченных сущностей модульное связывание, то есть их видят другие единицы трансляции того же модуля, просто не видит код, который подключает модуль. Это противоположность заголовкам, где в чужой код текстуально попадает вообще всё.
Открыть наружу можно почти любую сущность: функции, типы, шаблоны, переменные, псевдонимы using.
🪐 Удобные формы записи
❗️ export namespace открывает только то, что объявлено в этом блоке. Если позже снова открыть пространство имён net без export, новые имена наружу не уйдут.
❌ Ошибки
• export допустим только в единице, которая начинается с export module …;. В единице реализации (module geometry; без export) это ошибка компиляции
• export нельзя ставить на сущности в безымянном пространстве имён — у них внутреннее связывание
• функцию со static не открыть — она по определению локальна (внутреннее связывание)
• нельзя открывать что-либо из общей вступительной части модуля (того, что идёт до export module …;)
Из модуля наружу видно только то, что помечено 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