getIntegerv() 和 std::cout 的奇怪行为

Strange behaviour with getIntegerv() and std::cout

此代码:

#include <iostream>

#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>

int main(void)
{
    GLint version;
    glGetIntegerv(GL_MAJOR_VERSION, &version);
    std::cout << version << std::endl;
    //(Un)comment the next line
    //std::cout << "" << version << std::endl;
    glfwTerminate();
    return 0;
}

输出:

32766

0
0

当该行分别被注释或取消注释时。
我知道你必须在使用某些方法之前初始化 glfw 和 glew 库(glfw 初始化这仍然发生),但是......前一行如何改变其行为评论或取消注释下一行?机器转到过去执行上一行?我的天啊

PS:我知道什么是 "undefined behavior" 但这并不意味着你可以打破物理定律,回到过去并修改某些方法的行为。

I know that you have to init glew libraries before using some methods, but... How is possible that the previous line change its behavior commenting or uncommenting the next line?

因为这就是未定义行为中的"undefined"的意思。

当您在没有当前 GL 上下文的情况下调用 GL 函数时,任何事情都可能发生。所以你在 GL 端有未定义的行为。然而,在现实世界中,大多数实现在这种情况下只会做 nothing,所以 version 不会被写入,并且您正在打印 [=16] 的内容=]uninitialized 变量,所以你在 C++ 端有未定义的行为。在现实世界中,您很可能会打印堆栈的一些内容,并且通过更改代码,您正在更改编译结果。