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

标签 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 初始化这仍然发生),但是......前一行如何改变其行为评论或取消注释下一行?机器转到过去执行上一行?天啊

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

最佳答案

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?

因为这就是未定义行为中“未定义”的意思。

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

关于c++ - getIntegerv() 和 std::cout 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41781338/

相关文章:

c++ - 如果保存数据,libz 压缩失败

c++ - 节点的迭代层次结构 - 访客和复合?

ubuntu - gcc 上的静态和动态链接

python - 数字输出有时有.0

c# - 无法从 pg_dump.exe 命令行退出

c++ - 输出函数 C++ 的问题

c++ - 在内存映射文件时写入内存映射文件

c++ - 如何格式化CPP方式?

c++ - glm lookAt 和矩阵变换产生奇怪的行为

macos - OS X 上的 GLSL 着色器开发有哪些选择?