Модули С++ - почему они были удалены из С++ 0x? Вернутся ли они позже?

Я только что обнаружил этот старый проект С++ 0x о модулях в С++ 0x.

Идея состояла в том, чтобы выйти из текущей системы .h/.cpp, записав только файлы .cpp, которые затем будут генерировать файлы модулей во время компиляции, а затем, в свою очередь, будут использоваться другими .cpp файлами.

Это выглядит действительно замечательная функция.

Но мой вопрос: почему они удалили его из С++ 0x? Это из-за слишком многих технических трудностей? Нехватка времени? И как вы думаете, они будут рассматривать работу над ней для скрытой версии С++?

Ответ 1

Из Состояние С++ Evolution (Post San Francisco 2008), предложение модулей было категоризировано как "Заголовок для отдельного TR:"

Эти темы считаются слишком важными, чтобы ждать другого стандарта после С++ 0x перед публикацией, но слишком экспериментальный, чтобы быть доработанным для следующего Стандарта. Поэтому эти функции будут предоставлены техническим докладом при первой же возможности.

Предложение модулей просто не было готово и ожидало, что это задержит завершение стандарта С++ 0x. Он не был действительно удален, он просто не был включен в рабочий документ.

Ответ 2

Проект модулей С++ (Техническая спецификация после С++ 17)

Проект и несколько обновленных версий для спецификации модуля C/С++ опубликованы WG21 на open-std.org. Я буду ссылаться только на последние документы здесь:

  • Рабочий проект, расширения для С++ для модулей N4610 (октябрь 2016 г.).
  • Четвертая версия опубликована как P0142R0 (март 2016 г.).
  • Формулировка модулей, опубликованных как P0143R2 (март 2016 г.).
  • Команда clang опубликовала вторую ревизию своих изменений: P0273R1 (октябрь 2016 г.).

Следующие сообщения в блоге содержат резюме совещаний по стандартам и, в частности, сводку текущего состояния проекта модулей:

Обновление: Как объясняется в отчете о поездке Kona, с которым я связан выше, в настоящее время есть два конкурирующих предложения: один от Microsoft и один от Clang. Предлагаемое решение от Microsoft не позволяет экспортировать макросы, в то время как решение от команды Clang будет поддерживать экспорт макросов. Пока только Microsoft официально представила проект для спецификации модуля.

Спецификация модуля, предложенная Microsoft

Вот краткий обзор наиболее важных концепций, содержащихся в этом предложении. Поскольку проект, возможно, все еще изменится. Новый стандарт модулей, среди прочего, состоит из следующего:

A module для объявления модуля, несколько файлов могут объявить об этом для создания одного модуля (но для каждого модуля только один блок компиляции может содержать раздел export {}):

module M;

Ключевое слово import для импорта модулей, вместо import, также может быть принято решение использовать using module вместо этого, поэтому можно было бы избежать нового ключевого слова import.

import std.io;
import module.submodule;

An export синтаксис, который определяет общедоступные объявления, которые являются частью этого модуля, объявления неинтерфейса, которые не должны экспортироваться как часть модуля, будут определены вне блока экспорта. Объявления могут быть любыми декларациями в C/С++, то есть не только функциями, но и переменными, структурами, шаблонами, пространствами имен и классами:

export {
    int f(int);
    double g(double, int);

    int foo;

    namespace Calc {
         int add(int a, int b);
    }        
}

void not_exported_function(char* foo);

Важным изменением модулей будет то, что определения макросов и препроцессоров будут локальными для модулей и не будут экспортироваться. Таким образом, макросы не влияют на импортированные модули:

#define FILE "my/file"
import std.io;   //will not be impacted by the above definition

Важно отметить, что как текущая препроцессорная система, так и модули смогут сосуществовать, а заголовки все еще могут использоваться, например, для включения макросов.

Более подробную информацию я предлагаю прочитать в проекте.

Модули Clang

Clang работает над реализацией модулей, которые можно найти на странице страницы модулей clang. Однако clang в настоящее время не реализует конкретный синтаксис для модулей, то есть ни один из вышеупомянутых синтаксисов не был реализован Clang. Чтобы объяснить это, страница содержит следующее утверждение:

В настоящее время для деклараций импорта нет синтаксиса C или С++. Clang будет отслеживать предложение модулей в комитете С++. См. Раздел Включает в качестве импорта, чтобы увидеть, как модули импортируются сегодня.

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

Экспорт макросов из модулей

Как уже упоминалось выше, все еще неясно, будет ли макроэкспорт частью финальных модулей TS. В P0273R1 для экспорта макросов был предложен следующий синтаксис:

#export define MAX(A,B) ((A) > (B)) ? (A) : (B);

Ответ 3

Clang - это первый компилятор, который начинает работать над модулями еще до завершения стандартизации. Документации пока мало, но пример кода можно найти здесь:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/

Некоторые комментарии Дугласа Грегора (разработчик, реализующий их):
http://clang-developers.42468.n3.nabble.com/C-modules-td3619936.html

В теории вы можете определить кучу вспомогательных макросов, таких как begin_module, end_module, import_module, чтобы защитить себя от любых возможных изменений синтаксиса, который появится в будущем.

ИЗМЕНИТЬ 1:
Дуглас Грегор опубликовал презентацию о своей реализации:
http://llvm.org/devmtg/2012-11/Gregor-Modules.pdf?=submit

ИЗМЕНИТЬ 2:
Поддержка модуля в clang была зарегистрирована здесь:
http://clang.llvm.org/docs/Modules.html

ИЗМЕНИТЬ 3:
Модули теперь поддерживаются в компиляторе Microsoft С++: http://blogs.msdn.com/b/vcblog/archive/2015/12/03/c-modules-in-vs-2015-update-1.aspx

Ответ 4

  • Потому что это очень большие концептуальные изменения.
  • Нет необходимости в ней, поскольку разделение источников на h/cpp делает работу
  • Потому что С++ не определяет, как строятся библиотеки "модулей". Он уходит его разработчику компилятора и компоновщику.
  • "Модули" иногда довольно зависимы от платформы, например, библиотеки DLL совершенно разные из общих объектов. Поэтому не так тривиально сливаться между этими понятиями.