避免使用C ++库中的全局对象

时间:2014-07-23 14:30:55

标签: c++ c dll global

我有一些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实例,可以使用此类的全局实例,单例可能。我想避免使用全局变量,如何实现?

2 个答案:

答案 0 :(得分:3)

一种可能性是将您创建的实例的void指针返回给调用者,并让调用者将该指针传递给所有函数。库可以将该指针强制转换为正确的类型并调用实例上的方法。

它不漂亮,但你想要一个C API,所以你能期待什么。

答案 1 :(得分:0)

看起来设计不好,库应该在多线程环境中工作。这种“所有API调用能够使用相同的Foo实例”的需求可以防止非常错误。