📤 export: что именно вы отдаёте наружу? — 26 июля 2026 г. в 11:03:01.441
📤 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 …;)

