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

StackOverflow https://stackoverflow.com/questions/3596147

Вопрос

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

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

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

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

Это было полезно?

Решение

Из Состояние C ++ Evolution (пост San Francisco 2008), Предложение модулей было классифицировано как «заголовок для отдельного TR:»

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

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

Другие советы

Модули C ++ (техническая спецификация после C ++ 17)

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

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

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

Обновлять: Как объяснено в отчете о поездке 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);

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

#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.nablble.com/c-modules-td3619936.html.

Теоретически, вы можете определить кучу помощников MACROS, таких как 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, отличные от общих объектов. Так что это не так тривиально слияние между этими понятиями.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top