此代码:
#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:我知道什么是“未定义的行为”,但这并不意味着你可以打破物理定律,走向过去并修改某些方法的行为。
答案 0 :(得分:2)
我知道你必须在使用某些方法之前初始化glew库,但是......前一行怎么可能改变其行为注释或取消注释下一行?
因为这是未定义行为中的“未定义”的含义。
当您在没有当前GL上下文的情况下调用GL函数时,可能会发生任何事情。所以你在GL方面有未定义的行为。但是,在现实世界中,大多数实现只会在这种情况下执行 nothing ,因此version
无法写入,并且您正在打印未初始化的内容变量,因此您在C ++端有未定义的行为。在现实世界中,您很可能会打印堆栈的一些内容,并且通过更改代码,您将更改编译结果。