Это продолжение одного из моих предыдущих вопросов, и я придумала возможное решение для моего проекта, и мне нужны некоторые советы или рекомендации, если у меня есть это право.
По сути, мой проект - это библиотека, которая будет использоваться и компилироваться как в Linux, так и в Windows, часть Linux не представляет особой проблемы, ее Windows.
Моя библиотека состоит в основном из классов, поэтому 95% кода C ++. Чтобы обеспечить лучшую поддержку и избежать проблем с именами, я собираюсь использовать интерфейсы и фабричные методы для получения экземпляров этих классов, а не вызывать их напрямую. Я также буду использовать extern «C» ТОЛЬКО на заводских функциях, чтобы избежать искажения имени.
Итак, вот вопросы:
Я буду использовать макросы экспорта / импорта в функциях фабрики, но нужно ли мне тогда добавлять экспорт / импорт (__declspec (dllexport / import)) в заголовочные файлы всех классов, которые я хочу предоставить экземпляры для включения интерфейсов базового класса? Или достаточно просто экспортировать заводские функции?
Я также думал об использовании функций умного указателя для автоматического освобождения, хорошая идея или позволить пользователю справиться с этим? Я планировал использовать шаблон autoptr, который является частью стандартной библиотеки и доступен на обеих платформах, верно?
Может ли кто-нибудь осветить, какое соглашение о вызовах мне следует использовать? Я знаю, что она специфична для Microsoft, поэтому я надеюсь, что она не мешает Linux, поэтому я должен оставить это поле пустым и оставить его по умолчанию, как мне кажется, _thiscall или что-то в этом роде.
Я получаю ошибку для этого куска кода, я не уверен, почему, но это связано с внешним "C":
Ошибка:
ошибка: объявление функции C ‘std :: ostream & operator << (std :: ostream &, const MemInfo &) 'конфликтует с | предыдущее объявление ‘std :: ostream & operator << (std :: ostream &, const SpeedInfo &) ’здесь | </p>
ошибка: объявление функции C 'std :: ostream & operator << (std :: ostream &, const analysis_result &)' конфликтует с предыдущим объявлением 'std :: ostream & operator << (std :: ostream &, const MemInfo &)' здесь | </p>
... эти сообщения об ошибках повторяются для всех функций
Вот код:
//WINLIB is my macro for the dllimport/export
extern "C"{
//operator overloading for stream operation
WINLIB std::ostream& operator<<(std::ostream &st, const SpeedInfo &si);
WINLIB std::ostream& operator<<(std::ostream &st, const MemInfo &mi);
WINLIB std::ostream& operator<<(std::ostream &st, const analyzed_result&);
WINLIB std::ostream& operator<<(std::ostream &st, const ustring_set&);
WINLIB std::ostream& operator<<(std::ostream &st, const speed_map&);
WINLIB std::ostream& operator<<(std::ostream &st, const mem_map&);
WINLIB SpeedInfo operator+(SpeedInfo &si, SpeedInfo &si2);
WINLIB SpeedInfo& operator+=(SpeedInfo &si, SpeedInfo &si2);
WINLIB SpeedInfo operator-(SpeedInfo &si, SpeedInfo &si2);
WINLIB SpeedInfo& operator-=(SpeedInfo &si, SpeedInfo &si2);
WINLIB MemInfo operator+(MemInfo &mi, MemInfo &mi2);
WINLIB MemInfo& operator+=(MemInfo &mi, MemInfo &mi2);
WINLIB MemInfo operator-(MemInfo &mi, MemInfo &mi2);
WINLIB MemInfo& operator-=(MemInfo &mi, MemInfo &mi2);
}