Daniro_San
@Daniro_San
Программист

Модульность в C++ как это может выглядеть?

Читал про планирующуюся модульность в C++. Конкретно по существу - ничего не нашел.
Кто может объяснить как это будет?
Ведь по сути - все компилирующиеся а потом линкующиеся вместе .cpp файлы - это тоже модули (и даже у Страуструпа есть глава "Модульность").
Так что планируется изменить?
Модули будут связаны с файловой системой как пакеты как в Java?
Или будут сборки как в C#?
  • Вопрос задан
  • 3742 просмотра
Решения вопроса 3
Nipheris
@Nipheris Куратор тега C++
Пакеты Джавы и сборки Дотнета - это про модули в терминах крупной структуры приложения, они тут не при чем.
Речь идет о модулях на уровне программного кода.
Хотите примерно понять как это будет выглядеть - посмотрите, например, на юниты в Паскале. Это примерно и есть то, что хотят получить в конечном счёте - возможность по-человечески, на уровне языка, объявлять интерфейсы модулей, подключать их друг к другу, следить за зависимостями между модулями (разве что модули C++ вроде как не привязываются к единице компиляции, в отличие от юнитов Паскаля).
Сейчас в C++ это достигается большим хаком на уровне препроцессора (а не компилятора языка), называющимся include-файлы. Этот механизм, основанный на правиле "много объявлений, одно определение", унаследован из Си, и по сути представляет собой замену отсутствующей возможности передавать метаданные от одной единицы компиляции к другой при сборке проекта. С помощью инклудов вы напихиваете в один файл ВСЕ, что может потребоваться компилятору. По факту выливается в то, что бОльшая часть единицы компиляции после обработки препроцессором - это содержимое инклуд-файлов. И всё это обрабатывается компилятором каждый раз заново (в каждой единице компиляции). В Си это еще куда ни шло, но в плюсах, где многие библиотеки содержат тяжелый шаблонный код, это становится совсем печальным. Помимо этого, сама работа с инклудами - это непростая практика, и если следовать ей неверно, особенно новичкам, они могут получить от компилятора удивительнейшие ошибки. За примером далеко ходить не надо - попробуйте в большом проекте не ставить защиту от множественного инклуда.
Вся эта препроцессорная магия красоты и прозрачности языку не добавляет. Пока в других языках пишут "package foobar" и "import foobar", мы пишем "#pragma once" или даже "#ifndef FOOBAR_H ...". Уже грустно как-то становится.

Вышесказанное в одно предложение: модули хотят сделать настоящими, вместо имитации средствами препроцессора.
Ответ написан
Комментировать
AxisPod
@AxisPod
Главный вопрос, когда будет, учитывая что C++17 обрезали по полной. Дедушки всё наиграться в своей песочнице не могут.
Ответ написан
Комментировать
По сути измениться поведение #include. Не будет такой глубокой рекурсии включения всего в один большой текстовый файл. Сейчас каждый cpp компилируется отдельно, все заголовки парсятся каждый раз заново.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы