为什么返回非整数的glfwSetErrorCallback传入cout会输出整数?
问题原因说明
这个现象是C++标准库std::cout的输出规则导致的,和GLFW的返回值逻辑无关,具体原因如下:
- 首先确认GLFW的接口定义没有问题:
glfwSetErrorCallback的返回值确实是GLFWerrorfun类型,也就是你查到的函数指针类型,返回值为上一次注册的回调函数指针,首次注册无历史回调时返回NULL,符合官方描述。 - 你看到的0/1输出是
std::ostream的operator<<隐式类型转换的结果:- C++标准库没有为函数指针类型提供
<<运算符的重载,当你直接把函数指针传给std::cout时,编译器会自动把函数指针隐式转换为bool类型。 - 空指针转换为
bool值为false,输出时显示为0;非空的函数指针转换为bool值为true,输出时显示为1。
- C++标准库没有为函数指针类型提供
- 对应你的测试代码逻辑:
- 第一次调用
glfwSetErrorCallback(handleErrorCallback)时,之前没有注册过回调,返回NULL,转换为bool是false,输出0,和你的理解一致。 - 第二次调用
glfwSetErrorCallback(NULL)时,之前已经注册了handleErrorCallback,返回值是这个非空的函数指针,转换为bool是true,所以输出1,属于正常现象。
- 第一次调用
验证方法
如果需要打印函数指针的实际内存地址,可以手动把返回值强转为void*类型再输出,代码示例如下:
#define GLFW_DLL #include <glad/glad.h> #include <GLFW/glfw3.h> #include <iostream> void handleErrorCallback (int code, const char * description) { // Code } int main (int argc, char * argv[]) { // 强转为void*输出实际地址 std::cout << reinterpret_cast<void*>(glfwSetErrorCallback(handleErrorCallback)) << std::endl; std::cout << reinterpret_cast<void*>(glfwSetErrorCallback(NULL)) << std::endl; return 0; }
运行后第一行输出0(对应NULL的地址),第二行输出的就是handleErrorCallback函数的实际内存地址,不会再显示为1。
内容的提问来源于stack exchange,提问作者CoSalamander
相关产品推荐
相关产品推荐

