C++:静态库,如何制作像openGL这样的"objectless"上下文

C++: Static Library, how to make "objectless" contexts like openGL

本文关键字:openGL objectless 上下文 静态 何制作 C++      更新时间:2023-10-16

OpenGL在基于状态的系统上运行而不声明对象,您能在C++静态库中执行同样的操作吗?

我一直在使用如下所示的单光子技术:

static il_context& get()
{
static il_context sSingleton;
return sSingleton;
}
il_context(){}; // do nothing
~il_context(){}; // do nothing

然而,我的理解是,您必须在启动时将其声明为变量:

il_context ilContext;

有没有一种方法可以在函数调用上自激活singleton?

在您的库中,您可以在命名空间范围内声明一个全局变量:

// In library.cpp
Context ctx;
void library_func()
{
// Do something to ctx
}

如果您的库有多个源文件,则需要使用extern关键字来告诉编译器ctx存在于不同的翻译单元中:

// In library2.cpp
extern Context ctx;
void other_library_func()
{
// Do something else to ctx
}

或者,您可以使用一个函数(未在库中公开)在首次使用时创建ctx(在您的示例中使用的所谓Meyers Singleton):

Context& get_context()
{
static Context ctx;
return ctx;
}

在这种情况下,函数实现的第一行将调用get_context():

void library_func()
{
Context& ctx = get_context();
// Do something to ctx
}

无论哪种方式,不用说,用多个线程来完成这一切都是一件棘手的事情,需要仔细管理以防止两个函数同时修改ctx

我个人的感觉是,拥有这样一个隐藏的上下文单例比它的价值更麻烦,最好允许客户端自己传递Context指针/引用,并以正常的方式管理其生命周期。对于只能有一个实例的东西,如果对象已经存在,就让构造函数抛出,或者(更好)使用断言来指示程序员的错误。