我刚刚看到一行代码
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){
}
我不太明白, 然后我查找了函数定义。
GLFWglproc glfwGetProcAddress(const char *procname)
// which means this is a function takes a pointer and returns something
某事是
typedef void(* GLFWglproc) (void)
// a function pointer
确定glfwGetProcAddress接受一个指针并返回一个函数指针
然而,当我查看代码(GLADloadproc)glfwGetProcAddress时,它是什么意思?
typedef void* (* GLADloadproc)(const char *name);
GLADloadproc也是一个函数指针。
外部功能
void gladLoadGLLoader(GLADloadproc);
只是一个正常的功能。它需要一个函数指针,用它做一些事情并且不返回任何内容。
好吧,所以,当调用gladLoadGLLoader时,内部是一个函数指针,这意味着(GLADloadproc)glfwGetProcAddress是一个指向某个函数的函数指针。它从不调用glfwGetProcAddress,
然而,当我这样做时
if (!gladLoadGLLoader(static_cast<GLADloadproc>(glfwGetProcAddress))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
main.cpp:46:27: error: static_cast from 'GLFWglproc (*)(const char *)' (aka
'void (*(*)(const char *))()') to 'GLADloadproc' (aka 'void *(*)(const
char *)') is not allowed
我哪里错了?
答案 0 :(得分:0)
我哪里错了?
你使用错误的演员来完成这项工作。 static_cast
的静态类型检查非常严格。两种指针类型是不相关的,因此静态转换将是不正确的。
用于投射函数指针类型的内容是reinterpret_cast
。但是要注意,如果缺少C风格的演员表(会尝试保证一些演员表演),重新演绎演员是一个非常生硬的工具。除非你真的需要它,否则不要使用它,因为它放弃了很多静态类型检查。
最后,如果您确定它与声明的原型函数匹配,则只使用生成的指针类型来调用该函数。否则你会得到未定义的行为。