Модули C ++ - почему они были удалены из C ++ 0x?Вернутся ли они позже? - PullRequest
110 голосов
/ 29 августа 2010

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

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

Это похоже на действительно замечательную функцию.

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

Ответы [ 4 ]

89 голосов
/ 02 сентября 2014

Чертеж модулей 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);
69 голосов
/ 29 августа 2010

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

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

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

32 голосов
/ 03 марта 2012

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

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