Я новичок в модулях C++. Я использую Visual Studio 2022.
Допустим, я создаю DLL и не хочу, чтобы мои пользователи видели детали реализации моего класса. Как я могу добиться этого в модулях C++? В основном я вижу в Интернете примеры реализации функций в одном файле.
Могу ли я с уверенностью сказать, что интерфейсы модулей аналогичны файлам заголовков, а реализация модуля аналогична файлу cpp?
Вот мой пример реализации, это правильно?
AnimalParent.ixx
export module Animal:Parent;
export class Animal
{
public:
virtual void say();
};
AnimalParent.cpp
module Animal:Parent;
#include <iostream>
void Animal::say()
{
std::cout << "I am Animal" << std::endl;
}
Animal.cat.ixx
export module Animal:Cat;
import :Parent;
export class Cat :public Animal
{
public:
void say() override;
};
AnimalCat.cpp
module Animal:Cat;
#include <iostream>
void Cat::say()
{
std::cout << "I am cat" << std::endl;
}
Животное.ixx
export module Animal;
export import :Parent;
export import :Cat;
Вопросы:
Правильна ли эта реализация?
Могу ли я с уверенностью предположить, что файлы содержат export module name(.ixx extension)
- похожие на файлы заголовков и module name
- похожие на соответствующий исходный файл?
Если я передам эту DLL своему клиенту, что я должен буду дать? Моя DLL и папка, содержащая .ixx
файлы?
Как они будут интегрировать мою DLL? В текущей системе файлов заголовков они будут ссылаться на каталог файлов заголовков в Additional include directories
и ссылаться на библиотеку lib. Здесь им нужно ссылаться на папку, содержащую файлы .ixx
в Additional include directories
, и ссылаться на библиотеку?
Независимо от того, используете ли вы модули или нет, ваша реализация является частной для DLL. Пока вы не развернете исходный код DLL, ваши пользователи не увидят детали реализации. Вам необходимо предоставить объявления классов, чтобы пользователи могли взаимодействовать с классами, которые им экспортирует DLL, но им не нужен код реализации. Итак, мне немного непонятен ваш актуальный вопрос.
Я почти уверен, что вы не можете использовать одно и то же имя модуля в ixx
и cpp
. Это должно быть что-то вроде export module MyModule;
в .ixx
и module MyModule:Impl
в .cpp
.
вопрос 1 и 2: Да.
вопрос 3.
Чтобы использовать модуль в dll, вам необходимо экспортировать символ, используя __declspec(dllexport)
.
AnimalParent.ixx
export module Animal:Parent;
export class __declspec(dllexport) Animal
{
public:
virtual void say();
};
Animal.cat.ixx
export module Animal:Cat;
import :Parent;
export class __declspec(dllexport) Cat :public Animal
{
public:
void say() override;
};
что я должен дать
ModuleName.ixx.ifc
файлы. Эти файлы создаются Visual Studio после сборки DLL, подобно скомпилированным файлам заголовков. Вы можете найти их в папке obj вашего проекта (папка проекта vcxproj/x64/debug или Release/).Для вашего проекта есть три файла: AnimalParent.ixx.ifc, Animal.cat.ixx.ifc, Animal.ixx.ifc
.
вопрос 4: как пользоваться модулем
1. Свяжите файл lib.
2.Импортируйте файлы ifc: В свойствах проекта-> C/C++ -> Командная строка -> Дополнительные параметры:
/reference "<path> \AnimalParent.ixx.ifc"
/reference "<path> \Animal.cat.ixx.ifc,"
/reference "<path> \Animal.ixx.ifc"
Код: стандарт C++ 20.
import Animal;
int main()
{
Animal Ani;
Ani.say();
Cat cat;
cat.say();
}
У меня под рукой нет никаких ссылок, но я мог бы поклясться, что промежуточные файлы не предназначены для распространения. По крайней мере, для gcc и clang было рекомендовано распространять файлы интерфейса (в данном случае ixx). Может быть, для msvc все по-другому, и распространение ifcs нормально?
Не найден документ MSDN, связанный с распространением файлов ifc или ixx. Я нашел отчет: developercommunity.visualstudio.com/t/… .
@MinxinYu-MSFT спасибо за подробный ответ. Мне нравится этот ответ, но, как упомянул Вутц, с распространением файлов .ifc все в порядке?
На данный момент кажется, что это единственный путь. Приняв это как решение. Спасибо за ответ. @MinxinYu-MSFT.
Я новичок в модулях C++. Я предполагаю, что даже опытные программисты C++ плохо знакомы с модулями. Потому что эта функция еще не совсем развита во всех цепочках инструментов, и сложно перенести устаревшие базы кода C++ на использование модулей C++20.