COM интерфейс и возврат структур (С++)

Всё думаю о том, как лучше реализовывать взаимодействие с shared (DLL) библиотекой в С++. Остановился на идее COM интерфейса. Суть этой идеи в том, что у нас есть чисто виртуальные классы (интерфейсы) в заголовочных файлах:

class INode
{
public:
    virtual ~INode() = default;
    virtual ENodeType type() = 0;
    virtual void set_name(const char* name_str) noexcept = 0;
    [[nodiscard]] virtual const char* name() noexcept = 0;
    [[nodiscard]] virtual INode* parent() noexcept = 0;
    [[nodiscard]] virtual INode* children() noexcept = 0;
    [[nodiscard]] virtual unsigned children_count() noexcept = 0;
    virtual EResultCode add_child(INode* node) noexcept = 0;
    virtual EResultCode remove_child(INode* node) noexcept = 0;
};

Но они не экспортируются из библиотеки напрямую, экспортируются только некоторые функции (в стиле чистого С), которые создают уже реальные объекты внутри библиотеки и просто возвращают указатель (типа интерфейса) на этот самый объект:

extern "C"
{
    LIB_API INode* create_node();
    LIB_API void destroy_node(const INode* node);
}

В итоге пользователь подключает библиотеку, но имеет дело только с указателями на объекты, классы которых реализуют эти интерфейсы внутри. Таким образом нам не нужно экспортировать классы и при этом вроде бы и ООП работает.

Но моя цель - добиться того, чтобы только лишь информации о том, под какую архитектуру собиралась библиотека (x86 или x64), было достаточно для её надежного использования в независимости от компилятора (допустим, библиотека собиралась одним компилятором под x86, а использовать её можно в приложении собираемом другим компилятором под x86)

Но возникает несколько вопросов.

  • Есть ли в C++ какая-то гарантия, что стандартные типы (int, float, char* и тд.) всегда (во всех компиляторах) будут одинакового размера если сборка идет под одну и ту же архитектуру? Есть ли какой-то способ гарантировать это?
  • Насколько хорошей идеей будет, в случае с COM интерфейсом, возвращать (и передавать как аргумент методов) структуры? Допустим, у меня где-то в заголовочниках объявлена структура (состоящая из полей этих стандартных типов), и вот, на стороне библиотеки метод её возвращает. Если даже я добьюсь гарантии того что все поля структуры будут гарантированно одинаковых типов в любых компиляторах, нет ли здесь каких-то подводных камней (по типу "в одном компиляторе данные структуры пакуются в одном порядке, а в другом - в обратном + какие-нибудь выравнивания). Можно конечно возвращать ссылки или указатели на эти структуры, но сути это особо не меняет (все так же важно как именно в структуре лежат байты).

Ответы (0 шт):