Проект модулей C ++ (Техническая спецификация после C ++ 17)
Проект и несколько обновленных версий спецификации модуля C / C ++ были опубликованы WG21 на open-std.org. Здесь я буду ссылаться только на самые свежие документы:
- Рабочий проект, расширения C ++ для модулей N4610 (октябрь 2016 г.).
- Четвертая редакция опубликована как P0142R0 (март 2016 г.).
- Формулировка для модулей опубликована как P0143R2 (март 2016 г.).
- Команда clang опубликовала вторую версию своих изменений: P0273R1 (октябрь 2016 г.).
Следующие сообщения в блоге содержат сводку встреч по стандартам и, в частности, сводку текущего статуса проекта модулей:
Обновление: как объясняется в отчете о поездке Кона, на который я ссылался выше, в настоящее время есть два конкурирующих предложения, одно от 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);