是否可以将一个函数类型转换为另一个具有相同参数但返回类型不同的函数类型?

时间:2018-01-21 09:22:46

标签: c++ pointers

我刚刚看到一行代码

 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

我哪里错了?

1 个答案:

答案 0 :(得分:0)

  

我哪里错了?

你使用错误的演员来完成这项工作。 static_cast的静态类型检查非常严格。两种指针类型是不相关的,因此静态转换将是不正确的。

用于投射函数指针类型的内容是reinterpret_cast。但是要注意,如果缺少C风格的演员表(会尝试保证一些演员表演),重新演绎演员是一个非常生硬的工具。除非你真的需要它,否则不要使用它,因为它放弃了很多静态类型检查。

最后,如果您确定它与声明的原型函数匹配,则只使用生成的指针类型来调用该函数。否则你会得到未定义的行为。