Структура модулів C ++ (Технічні умови після C ++ 17)
Проект та кілька оновлених версій специфікації модуля C / C ++ WG21 опублікував на open-std.org. Я посилаюсь лише на останні документи тут:
- Робочий проект, розширення на C ++ для модулів N4610 (жовтень 2016).
- Четверта редакція опублікована як P0142R0 (березень 2016 року).
- Формулювання для модулів опубліковано як P0143R2 (березень 2016 року).
- Колективна команда опублікувала другу редакцію їх змін: 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 ++. Кланг відстежує пропозицію модулів у комітеті C ++. Дивіться розділ Включає як імпорт, щоб побачити, як сьогодні імпортуються модулі.
Основна частина, яку зараз реалізує Кланг, - це "Мова модульної карти", яка дозволяє писати модульні карти для існуючого коду, який все ще використовує файли заголовків.
Експорт макросів з модулів
Як було сказано вище, поки не ясно, чи буде макроекспорт входити до кінцевих модулів ТС . У P0273R1 для експорту макросів був запропонований наступний синтаксис:
#export define MAX(A,B) ((A) > (B)) ? (A) : (B);