Задать вопрос
Daniro_San
@Daniro_San
Программист

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

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

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

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

Похожие вопросы