В V2019 почти завезли долгожданные модули. Даже как-то работает, но не всё. IntelliSense все черкает красным, go to definition не всегда итд по мелочи. Но главное что не понял, это как должны работать type alias'ы с учетом модулей? Задумано, что избавляемся от инклудов, переходим на модули. А у меня много где используются using'и для удобства. Так-то они в инклудах были. Например:
XOO>import MyTypes; XOO>int main() XOO>{ XOO> VectorInt vec{ 42 }; XOO>} XOO>[/ccode] XOO>Не видит, сыплет ошибками. XOO>Я делаю что-то не так? Не допилили? Или вообще теперь невозможно using'и вытащить наружу?
Попробуй добавить имя модуля: MyTypes::VectorInt...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
XOO>ЗЫ. Почитал пропозал, который принят, модулей — все делаю правильно, export using бла-бла-бла и должен быть. Значит не допилили, получается.
Ну, я хотел проверить — микрософт жеж. Они могли и по-своему запилить.
Значит не допилили.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>Ну, я хотел проверить — микрософт жеж. Они могли и по-своему запилить.
Не думаю, что они поперек стандарта пойдут. Чем-нибудь дополнить, это да.
Например, имена и расширения файлов модулей не оговариваются и микрософт сделал жесткую привязку к .ixx, хотя какая разница, какое расширение делать?
А что если в модуле есть экспорт функции, которая принимает в качестве аргумента незаэкспорченный класс? Этот класс ведь по идее должен тоже подсасываться автоматом...
// lib1.cpp
export module lib1;
struct point { // не экспортируем этот классint x, y;
};
export void scale(point & pt, int factor) {
// что-то делаем с pt, скалируем
}
// main.cpp
import lib1;
int main() {
point pt = {10, 10};
scale(pt, 2);
return 0;
}
Здравствуйте, XOOIOOX, Вы писали:
XOO>В V2019 почти завезли долгожданные модули.
Ещё вопрос по модулям, но уже по архитектуре. Почитал описание у микрософт и они пишут о создании разных файлов интерфейса и реализаций. Чем это мотивировано? Правильно ли делать реализацию и интерфейс в одном файле? Не увеличит ли это время компиляции?
Здравствуйте, Sm0ke, Вы писали:
S>А что если в модуле есть экспорт функции, которая принимает в качестве аргумента незаэкспорченный класс? Этот класс ведь по идее должен тоже подсасываться автоматом...
Наружу то, что не проэкспортировано, не протекает. Класс point не виден.
То же касается макросов и типов из добавленных в модуль инклудов, если они не проэкспортированы явно.
Здравствуйте, PavelCH, Вы писали:
PCH>Ещё вопрос по модулям, но уже по архитектуре. Почитал описание у микрософт и они пишут о создании разных файлов интерфейса и реализаций. Чем это мотивировано? Правильно ли делать реализацию и интерфейс в одном файле? Не увеличит ли это время компиляции?
Можно и так и сяк. Время компиляции не должно увеличиться, т.к. экспортируются имена, а не реализации. То есть при импорте реализация не имеет значения, ищутся только имена, которые импортируются. Реализация обрабатывается при компиляции единицы трансляции соответствующего модуля.
XOO>В V2019 почти завезли долгожданные модули. Даже как-то работает, но не всё.
Вы уж извините что в вашу тему, но вопрос по модулям.
Кто-то знает как экспортировать макросы из модуля? Совсем никак?
Здравствуйте, XOOIOOX, Вы писали:
XOO>В V2019 почти завезли долгожданные модули.
Еще тогда вопрос по модулям, кто может знает
Вот есть код трех файлов:
Здравствуйте, XOOIOOX, Вы писали:
XOO>Здравствуйте, Sm0ke, Вы писали:
S>>А что если в модуле есть экспорт функции, которая принимает в качестве аргумента незаэкспорченный класс? Этот класс ведь по идее должен тоже подсасываться автоматом...
XOO>Наружу то, что не проэкспортировано, не протекает. Класс point не виден. XOO>То же касается макросов и типов из добавленных в модуль инклудов, если они не проэкспортированы явно.
А если такое:
// lib1.cpp
export module lib1;
struct point {
int x, y;
};
export struct shape {
point pos;
};
// main.cpp
import lib1;
int main() {
shape s1;
s1.pos.x = 10; // "point" то по идее не виден ...return 0;
}
Здравствуйте, PavelCH, Вы писали:
PCH>Кто-то знает какая будет принципиальная разница если в test2.ixx раскоментить static? Это одно и то же? Или есть ньюансы?
В общем случае у foo будет либо module linkage, либо internal linkage. Соответственно, foo будет либо общей на модуль, либо уникальной для TU.
Тут, как и в С++ без модулей, хорошим стилем будет следование правилу, что все внутренние сущности должны быть либо помечены static, либо помещены в anonymous namespace ([1][2][3]), чтобы форсировать внутреннее связывание. Это не только позволяет компилятору не заниматься лишней работой и ловить ошибки с неиспользуемыми функциями и переменными, но и упрощает чтение кода: при виде static void foo() {} сразу понятно, что эта локальная функция и за пределами TU не используется (например, это значит, что её можно смело менять, не боясь сломать какой-то внешний код, который мог бы её вызывать).