在源代码中,调用函数时不带 ().文档给出了 1 个必需的参数
In source code, function is called with no (). Documentation gives 1 required argument
我正在努力学习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
注册该回调。
- 正在查找文档以获得PS4平台的C++中的设备信息
- 如何在文档文件夹中创建目录
- 当Microsoft文档仅包含 C# 示例时,如何查找 C++ 包含文件名
- 通过构造函数创建一些值并尝试添加到文档中使用 rapidjson 不起作用
- 关于类的 Python 文档 - 对C++的引用不正确
- C++/autoconf 等效于文档库要求.txt的要求是什么?
- mbed:使用 USB 文档库编译会导致错误
- C++ VISUAL STUDIO:GLFWwindow没有初始化,即使它是在文档中编写的并且以前工作过
- 使用 yaml-cpp 更新 YAML 文档的节点和值
- 在加载 MSHTML 文档之前从 MSHTML 文档中删除无效的 URL
- 如何在C++中表示JSON文档的递归对象结构?
- 如何查找 Redshift Maya API 文档?
- 如何使用值模板编写文档测试用例?
- 如何使用 Gradle DSL(领域特定语言)上的文档?
- ncurses 找不到任何关于cchar_t的文档
- 文档在哪里说明如果参数不是从末端删除参数,则无法从QT信号插槽连接中删除参数?
- Doxygen,当参数类型定义使签名相同时,如何拆分函数文档?
- 在源代码中,调用函数时不带 ().文档给出了 1 个必需的参数
- 多个参数的Doxygen文档
- Doxygen:是否可以对C++函数参数进行分组,即在不复制的情况下拥有相同的文档