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

时间:2017-01-21 15:52:41

标签: 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;
    //(Un)comment the next line
    //std::cout << "" << version << std::endl;
    glfwTerminate();
    return 0;
}

输出:

32766

0
0

分别对该行进行注释或取消注释时 我知道你必须在使用某些方法之前初始化glfw和glew库(用glfw初始化它仍然会发生),但是...前一行怎么可能改变它的行为注释或取消注释下一行?机器过去并执行上一行? OMG

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

1 个答案:

答案 0 :(得分:2)

  

我知道你必须在使用某些方法之前初始化glew库,但是......前一行怎么可能改变其行为注释或取消注释下一行?

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

当您在没有当前GL上下文的情况下调用GL函数时,可能会发生任何事情。所以你在GL方面有未定义的行为。但是,在现实世界中,大多数实现只会在这种情况下执行 nothing ,因此version无法写入,并且您正在打印未初始化的内容变量,因此您在C ++端有未定义的行为。在现实世界中,您很可能会打印堆栈的一些内容,并且通过更改代码,您将更改编译结果。