У меня есть библиотека C++, предоставляющая собственный C API для своего клиента. Фактически эта библиотека является оболочкой вокруг некоторого экземпляра класса, а вызовы API должны работать с одним и тем же экземпляром класса, используя его публичный интерфейс, например:
// library API, using class methods internally
MYDLL_API uint8_t __stdcall init();
MYDLL_API uint8_t __stdcall release();
MYDLL_API uint8_t __stdcall setSomething();
MYDLL_API uint8_t __stdcall doSomething();
// some inernal class
class Foo{
public:
void setSomething();
void doSomething();
private
// some state
};
Единственный способ предоставить все возможности API-вызовов работать с одним и тем же экземпляром Foo
я вижу, - это использовать глобальный экземпляр этого класса, одноэлементный. Я хочу избежать использования глобальных переменных, как это можно достичь?
Одна из возможностей - вернуть указатель void экземпляра, который вы создаете для вызывающего, и передать вызывающий код всем функциям. Библиотека может наложить этот указатель на соответствующий тип и вызвать методы в экземпляре.
Это не очень, но вы хотите API C, так что вы можете ожидать.
Похоже на плохой дизайн, библиотеки должны работать в многопоточных средах. Эта необходимость для "всех вызовов API-вызовов для работы с одним и тем же экземпляром Foo" предотвращает очень плохое.