c++ - 在源代码中,调用函数时不使用 ()。文档给出了 1 个必需参数

标签 c++ opengl glfw

我正在学习 OpenGL 开发,在处理一些示例源代码时,有一行我似乎无法理解。它涉及使用 GLFW 初始化 GLAD。下面是整个代码块。

if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
    std::cout << "Failed to initialize GLAD" << std::endl;
    return -1;
}

因此,据我所知,if 语句中的代码旨在初始化 GLAD 并在初始化成功时返回 1,以便轻松处理错误。凉爽的。不过,我感到困惑的是这个 gladLoadGLLoader 函数的输入,即:

(GLADloadproc)glfwGetProcAddress

做了一些研究,GLADloadproc没有返回任何有用的东西,但是glfwGetProcAddress在GLFW文档here中有一个条目。 ,据此,它是一个函数并定义了 1 个必需参数。我认为这很奇怪,因为在源代码中它甚至看起来不像一个函数;看起来 glfwGetProcAddress 是一个被转换为 GLADloadproc 类型的变量(或者对象?)。经过一些反省,我运行了以下打印:

std::cout << glfwGetProcAddress << std::endl;
std::cout << typeid(glfwGetProcAddress).name() << std::endl;

输出:

00AE1172
void (__cdec*__cdecl(char const *))(void)

所以我可以看到,调用 glfwGetProcAddress 实际上会返回一些看起来像地址的东西,但尝试将其调用为 glfwGetProcAddress() 会失败,而不是令人震惊的是需要一个论据。当查看这个假定地址的类型时,我绝对不明白。因此,我很乐意使用它,因为它显然有效,并且在官方文档和教程中直接引用,但我真的很想了解这里发生的情况,如果有人碰巧确实比我有更好的想法。

最佳答案

OpenGL 扩展(在某些操作系统上,OpenGL 1.1 配置文件中未定义的每个函数)必须是 loaded at runtime 。这意味着必须通过适当的操作系统 API (wgl/glx/...) 查询每个函数的地址。结果是 function pointer可用于调用该函数。

GLAD 现在是一个为您处理函数指针加载的库。但是为了能够查询函数指针,它需要知道应该使用哪种方法来检索它们(正如已经说过的,这是操作系统/窗口 api 相关的)。 GladLoadGLLoader 的第一个参数是一个函数指针,指向用于按名称检索 OpenGL 函数指针的函数。 gladLoadGLLoader 然后调用这个函数(指针)来查询其他函数指针。

对于 glfw,使用的函数是 glfwGetProcAddress,但也可以在使用 glut 时传递 glutGetProcAddress 或在使用 SDL 时传递 SDL_GL_GetProcAddress .

关于c++ - 在源代码中,调用函数时不使用 ()。文档给出了 1 个必需参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48329950/

相关文章:

c++ - 这会根据这些概率给我适当的随机数吗? C++

c++ - Asio 内部线程对用户透明吗?

c++ - opengl斜投影

opengl - 学习游戏开发,有什么书推荐吗?

c++ - glCallList 上的 OpenMP 段错误的 GLFW3(以及 glfw 中的其他地方)

c++ - 打印一个 unicode 拉丁字母 (utf8)

c++ - 访问类函数时出现奇怪的错误

c - OpenGL - 将数据分配给 C 中的列表并在 glBufferData 中使用它无法正常工作

c++ - OpenGL 使用 glm::rotate 绕全局轴旋转

mouse - OpenGL - 使用鼠标左右键进行操作