C++:静态库,如何使 "objectless"上下文像 openGL

标签 c++ opengl static-libraries game-engine

OpenGL 在基于状态的系统上运行而不声明对象,你能在 C++ 静态库中做同样的事情吗?

我一直在使用如下所示的 sSingleton 技术:

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

但是,我的理解是你必须在启动时将它声明为一个变量:

il_context ilContext;

有没有办法在函数调用时自激活单例?

最佳答案

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

// 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

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

关于C++:静态库,如何使 "objectless"上下文像 openGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21900032/

相关文章:

c++ - C++/WinRT 中的 UWP 可选包

c++ - 使用 glm 创建 View 矩阵

opengl - 有效的 OpenGL 上下文

ios - 在 CocoaPods 1.5 中使用静态库在导入时没有这样的模块

c - 使用静态库编译的共享库中 undefined symbol

c++ - 如何将 DirectX 库包含到我自己的静态库(独立库)中?

c++ - ofstream中可以设置 "eof"吗?

C++跳转到其他方法执行

c++ - time_t 和 tm 转换中的值错误

opengl - 用于OpenGL着色器开发的图形卡