LINUX.ORG.RU

История изменений

Исправление alysnix, (текущая версия) :

На заголовках такого не сделать нормально, потому что из заголовков экспортируется вообще всё. Модули в C++ позволяют определить, что именно я хочу переэкспортировать наружу.

нету никаких «заголовков». это лишь текстовые куски, которые препроцессор вставит там, где будет директива #include.

отсюда вывод - в «заголовках» пишется только то, что вы хотите показать наружу и вставить во внешний файл. и инклудить в сами заголовки надо только то, что необходимо для компиляции ЭТОГО заголовка.

в человечных модульных языках для этого есть definition module - где перечисляются экспортируемые обьекты, и implementaion module - где экспортируемые обьекты и все внутренности реализуются.

компилятор читает только оттранслированные definition модули, при импорте.

а когда все в одном модуле с пометкой export… а сам модуль размером с черти сколько строк… то понять, что из него экспортруют - сложно. а сокращение списка экспорта, это считай нужный рефакторинг.

а форвард декларация класса все равно нужна, поскольку неизбежна будет циклическая зависимость классов в релизации, и чтобы ее разрешить надо иметь возможность описывать класс только в виде деклараций методов(но не имплементаций) и полей.

Исходная версия alysnix, :

На заголовках такого не сделать нормально, потому что из заголовков экспортируется вообще всё. Модули в C++ позволяют определить, что именно я хочу переэкспортировать наружу.

нету никаких «заголовков». это лишь текстовые куски, которые препроцессор вставит там, где будет директива #include.

отсюда вывод - в «заголовках» пишется только то, что вы хотите показать наружу и вставить во внешний файл. и инклудить в сами заголовки надо только то, что необходимо для компиляции ЭТОГО заголовка.

в человечных модульных языках для этого есть definition module - где перечисляются экспортируемые обьекты, и implementaion module - где экспортируемые обьекты и все внутренности реализуются.

компилятор читает только оттранслированные definition модули, при импорте.

а когда все в одном модуле с пометкой export… а сам модуль размером с черти сколько строк… то понять, что их него экспортруют - сложно. а сокращение списка экспорта, это считай нужный рефакторинг.

а форвард декларация класса все равно нужна, поскольку неизбежна будет циклическая зависимость классов в релизации, и чтобы ее разрешить надо иметь возможность описывать класс только в виде деклараций методов(но не имплементаций) и полей.