在源代码中,调用函数时不带 ().文档给出了 1 个必需的参数

In source code, function is called with no (). Documentation gives 1 required argument

本文关键字:参数 文档 调用 源代码 函数      更新时间:2023-10-16

我正在努力学习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 文档中有一个条目,根据这个,它是一个函数并定义了 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 配置文件中未定义的每个函数)必须在运行时加载。这意味着必须通过相应的操作系统 api (wgl/glx/...) 查询每个函数的地址。结果是可用于调用函数的函数指针。

GLAD 现在是一个为你处理此函数指针加载的库。但是为了能够查询函数指针,它需要知道应该使用哪个方法来检索它们(如前所述,这取决于操作系统/窗口 api)。要gladLoadGLLoader的第一个参数是指向用于按名称检索 OpenGL 函数指针的函数的函数指针。 然后gladLoadGLLoader调用此函数(指针)来查询其他函数指针。

在 glfw 的情况下,使用的函数是glfwGetProcAddress但也可以在使用 glut 时传递glutGetProcAddress,或者在使用 SDL 时传递SDL_GL_GetProcAddress

typedef void* (* GLADloadproc)(const char *name);

这不仅仅是任何旧的指针类型:这是一种函数指针类型。 在代码中,调用函数gladLoadGLLoader,但传递glfwGetProcAddress的地址gladLoadGLLoader现在可以随时调用你传递的参数,无论它想要什么参数。 你自己实际上并没有打电话给glfwGetProcAddress.

在此上下文中,glfwGetProcAddress是一个"回调",gladLoadGLLoader注册该回调。