Чертеж модулей 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);