Как скрыть детали реализации в модулях C++?

Я новичок в модулях 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;

Вопросы:

  1. Правильна ли эта реализация?

  2. Могу ли я с уверенностью предположить, что файлы содержат export module name(.ixx extension) - похожие на файлы заголовков и module name - похожие на соответствующий исходный файл?

  3. Если я передам эту DLL своему клиенту, что я должен буду дать? Моя DLL и папка, содержащая .ixx файлы?

  4. Как они будут интегрировать мою DLL? В текущей системе файлов заголовков они будут ссылаться на каталог файлов заголовков в Additional include directories и ссылаться на библиотеку lib. Здесь им нужно ссылаться на папку, содержащую файлы .ixx в Additional include directories, и ссылаться на библиотеку?

Я новичок в модулях C++. Я предполагаю, что даже опытные программисты C++ плохо знакомы с модулями. Потому что эта функция еще не совсем развита во всех цепочках инструментов, и сложно перенести устаревшие базы кода C++ на использование модулей C++20.

prapin 09.07.2024 20:33

Независимо от того, используете ли вы модули или нет, ваша реализация является частной для DLL. Пока вы не развернете исходный код DLL, ваши пользователи не увидят детали реализации. Вам необходимо предоставить объявления классов, чтобы пользователи могли взаимодействовать с классами, которые им экспортирует DLL, но им не нужен код реализации. Итак, мне немного непонятен ваш актуальный вопрос.

Remy Lebeau 09.07.2024 20:56

Я почти уверен, что вы не можете использовать одно и то же имя модуля в ixx и cpp. Это должно быть что-то вроде export module MyModule; в .ixx и module MyModule:Impl в .cpp.

Osyotr 09.07.2024 22:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
3
285
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

вопрос 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;
};

что я должен дать

  1. DLL и файлы Lib.
  2. 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 нормально?

Wutz 10.07.2024 10:13

Не найден документ MSDN, связанный с распространением файлов ifc или ixx. Я нашел отчет: developercommunity.visualstudio.com/t/… .

Minxin Yu - MSFT 10.07.2024 10:48

@MinxinYu-MSFT спасибо за подробный ответ. Мне нравится этот ответ, но, как упомянул Вутц, с распространением файлов .ifc все в порядке?

suresh kumar 12.07.2024 11:53

На данный момент кажется, что это единственный путь. Приняв это как решение. Спасибо за ответ. @MinxinYu-MSFT.

suresh kumar 12.07.2024 20:09

Другие вопросы по теме