C++执行流程

C++ flow of execution

本文关键字:执行流 C++      更新时间:2023-10-16

我一直在研究我现在面临的一个错误,事实证明C++运行时(并调用主函数(之前初始化类。然而,我的程序是一个 opengl 程序,它需要在完成其他任何事情之前设置某些事情......有什么办法可以解决这个问题吗?问题很简单,但无论如何,这里有一些伪/c++ 代码:

class shader
{
    shader() { /* constructor... DEPENDS ON GL SET UP! But called first!*/ }
} 
// global/static shaders
shader geometry;
shader lighting;
int main()
{
    glewInit(); // initialize opengl
}

编辑:根据评论添加了更多信息。是的,我的着色器类是静态的,它们是问题所在。唯一的解决方案是将这些静态类变成指针,并在main的初始化完成后分配它们?还是有没有办法延迟初始化?

您应该停止将代码放入全局变量的构造函数中,这需要调用glewInit

实际上,最好避免使用其构造函数或析构函数执行任何操作的全局变量,因为全局变量的初始化顺序不清楚。 使用全局析构函数也会使您的关闭序列更加困难。

如果你想使用全局变量,因为使用局部变量来main()和传递它太烦人了,那么你需要确保全局变量直到以后才会被初始化。一种方法是将其放在函数中:

shader &geometry()
{
    static shader g;
    return g;
}

在你的头文件中,shader &geometry();,并确保不要从其他全局变量的任何地方调用它! 函数中的静态变量在第一次调用函数之前不会初始化。 (警告:您仍然无法以这种方式控制销毁顺序 - 您将无法干净地销毁此着色器,然后取消初始化 GL(

另一种方法是使用智能指针:

std::unique_ptr<shader> p_geometry;
int main()
{
    glewInit();
    p_geometry = std::make_unique<shader>();
    // use *p_geometry... 
    // If you want to shut down tidily
    p_geometry.reset(nullptr);        
}
在任何

函数或类之外声明的对象都放在全局范围内。此类对象是在执行main之前构造的。这就是在初始化 OGL 之前构造shader对象的原因。

这可能是您需要做的:

int main()
{    
    glewInit(); // initalize opengl
    shader geometry;
    shader lighting;
}

只需将shader对象移动到 main 函数的本地范围内,即可确保它们在您希望初始化时初始化 - 在glewInit()调用之后。