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

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

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

Это выглядит как отличная особенность.

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

4 ответа

Решение

Начиная с State of C++ Evolution (Post San Francisco 2008), предложение по модулям было классифицировано как "заголовок для отдельного ТР:"

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

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

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

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

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

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

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

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

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

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

module M;

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

import std.io;
import module.submodule;

export синтаксис, который определяет публичные объявления, которые являются частью этого модуля, неинтерфейсные объявления, которые не должны экспортироваться как часть модуля, будут определены вне блока экспорта. Объявления могут быть любым видом объявлений в C/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 или C++ для объявлений импорта. Clang будет отслеживать предложение модулей в комитете C++. См. Раздел Включает как импорт, чтобы увидеть, как модули импортируются сегодня.

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

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

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

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

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 C++: http://blogs.msdn.com/b/vcblog/archive/2015/12/03/c-modules-in-vs-2015-update-1.aspx

  1. Потому что это очень большие концептуальные изменения.
  2. В этом нет особой необходимости, так как разделение источников на h/cpp делает работу
  3. Потому что C++ не определяет, как создаются библиотеки "модулей". Это оставляет разработчику компилятора и компоновщику.
  4. "Модули" иногда сильно зависят от платформы, например, библиотеки DLL сильно отличаются от общих объектов. Так что объединение этих понятий не так уж тривиально.
Другие вопросы по тегам