C++执行流程
C++ flow of execution
我一直在研究我现在面临的一个错误,事实证明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()
调用之后。
相关文章:
- 在程序执行期间从标准输出重定向到自定义流
- c++中的执行时间和检查流状态
- 张量流错误:执行器无法创建内核。没有注册'Snapshot' 适用于 GPU 设备的 OpKernel 运行图像标签示例
- 如何分离以C++执行的 Java 应用程序的 stdin/stout/stderr 流
- 如何在SDL2音频流数据上执行实时FFT
- 执行问题流
- Pycuda使用流执行推力
- 对理解C++代码的流执行稍有帮助
- 如何重载iostream运算符以在整个流上执行功能
- C++ 在写入流时执行函数
- C++ >>变量名称执行中的流
- 如何让输出流稍后执行某些操作
- cuda流:流执行后未调用回调
- cocos2d-X 中的执行流
- 为什么要使用fopen打开流,并使用读/写(而不是fread/fwrite)执行I/O
- python:读取可执行文件的 stdout,破碎的流
- Clang静态分析-根据执行流检查可为空的变量初始化
- 块执行流,直到脚本执行完成
- 在执行二进制序列化时,删除字符串流结果的const-ness是否安全?
- 系统()调用批处理可执行流文件使程序在windows上重置