Информация об изменениях

Сообщение Re: Экспорт p-impl из dll от 14.08.2023 8:20

Изменено 14.08.2023 8:22 vdimas

Re: Экспорт p-impl из dll
Здравствуйте, Chorkov, Вы писали:

C>Как побороть:


Не указывай dllexport для всего класса, указывай только для нужных методов.
Плюшки — не будешь тянуть приватные методы в экспорт, оставишь легковесность инлайным.


#define __declspec(dllexport) IMPORT_EXPORT
class Foo
{
private:
   struct Impl;
   std::shared_ptr<Impl> p_impl; 

public:
   // Все конструкторы/деструкторы заданы явно либо запрещены:
   IMPORT_EXPORT Foo();
   IMPORT_EXPORT Foo(const Foo&);
   IMPORT_EXPORT ~Foo();
   IMPORT_EXPORT Foo& operator=(const Foo&) = delete;

   // Доступ к структуре объекта (на стороне dllimport) ненужен, 
   // На стороне пользователя может оказаться другой размер класса shared_ptr?
  
   // ... что-то для работы с классом. 
   IMPORT_EXPORT int do_work(int);

   // метод инлайный
   int do_work2() {
      if(int x = some_pre_сheck())
         return x;

      return do_work2_impl();
   }

private:
   // не экспортируется и не импортируется
   int do_work2_impl();
};
Re: Экспорт p-impl из dll
Здравствуйте, Chorkov, Вы писали:

C>Как побороть:


Не указывай dllexport для всего класса, указывай только для нужных методов.
Плюшки — не будешь тянуть приватные методы в экспорт, оставишь легковесность инлайным.


#define __declspec(dllexport) IMPORT_EXPORT
class Foo
{
private:
   struct Impl;
   std::shared_ptr<Impl> p_impl; 

public:
   // Все конструкторы/деструкторы заданы явно либо запрещены:
   IMPORT_EXPORT Foo();
   IMPORT_EXPORT Foo(const Foo&);
   IMPORT_EXPORT ~Foo();
   IMPORT_EXPORT Foo& operator=(const Foo&) = delete;

   // Доступ к структуре объекта (на стороне dllimport) ненужен, 
   // На стороне пользователя может оказаться другой размер класса shared_ptr?
  
   // ... что-то для работы с классом. 
   IMPORT_EXPORT int do_work(int);

   // метод инлайный
   int do_work2() {
      if(int x = some_pre_сheck())
         return x;

      return do_work2_impl();
   }

private:
   int IMPORT_EXPORT do_work2_impl();

   // не экспортируется и не импортируется
   int do_work3_impl();
};