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

C++ getIntegerv()和std::cout的奇怪行为,c++,opengl,output,iostream,undefined-behavior,C++,Opengl,Output,Iostream,Undefined Behavior,此代码: #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;

此代码:

#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;
}

当行分别被注释或未注释时。
我知道在使用某些方法之前必须初始化glfw和glew库(glfw初始化的情况仍然存在),但是。。。前一行在注释或取消注释下一行时如何改变其行为?机器返回过去并执行上一行?天哪

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

我知道在使用某些方法之前必须初始化glew库,但是。。。前一行在注释或取消注释下一行时如何改变其行为

因为这就是未定义行为中“未定义”的含义

在没有当前GL上下文的情况下调用GL函数时,任何情况都可能发生。因此,这里有来自GL端的未定义行为。但是,在现实世界中,大多数实现在这种情况下都不做任何事情,所以<代码>版本<代码>没有写入,并且正在打印未初始化变量的内容,因此在C++侧上有未定义的行为。在现实世界中,您很可能打印堆栈的某些内容,通过更改代码,您正在更改编译结果

我知道在使用某些方法之前必须初始化glew库,但是。。。前一行在注释或取消注释下一行时如何改变其行为

因为这就是未定义行为中“未定义”的含义


在没有当前GL上下文的情况下调用GL函数时,任何情况都可能发生。因此,这里有来自GL端的未定义行为。但是,在现实世界中,大多数实现在这种情况下都不做任何事情,所以<代码>版本<代码>没有写入,并且正在打印未初始化变量的内容,因此在C++侧上有未定义的行为。在现实世界中,您很可能打印堆栈的某些内容,通过更改代码,您正在更改编译结果。

跟着我重复:未定义的行为是未定义的!跟我重复:未定义的行为是未定义的!我知道什么是“未定义的beavior”。但我的问题是:一个未定义的行为怎么可能违反物理定律,导致时空断裂,导致前一行改变其行为?它没有违反物理定律。我已经写了。当您编译一个不同的程序时,您不能假定其余的代码保持不变。变量可能在堆栈的其他位置结束,或者堆栈可能以不同的值结束。如果您真的想看到发生了什么,那么您必须查看两种变体的反汇编代码,而不仅仅是源代码。这正是未定义行为的要点。在现实世界中,它不是“未定义的”,它是在一层上未定义的,但仍然是由下面的层定义的。因为不为人所知的时空的随机量化性质加上海森堡著名的不确定性,使操作系统每次在不同的执行中请求glGetIntegerv时都向其提供不同的内存地址。我知道什么是“未定义beavior”。但我的问题是:一个未定义的行为怎么可能违反物理定律,导致时空断裂,导致前一行改变其行为?它没有违反物理定律。我已经写了。当您编译一个不同的程序时,您不能假定其余的代码保持不变。变量可能在堆栈的其他位置结束,或者堆栈可能以不同的值结束。如果您真的想看到发生了什么,那么您必须查看两种变体的反汇编代码,而不仅仅是源代码。这正是未定义行为的要点。在现实世界中,它不是“未定义的”,它是在一层上未定义的,但仍然由下面的层定义。因为未知但随机的时空性质加上海森堡著名的不确定性,使得操作系统每次在不同的执行中要求它时,都向glGetIntegerv提供不同的内存地址。
32766
0
0