You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么返回非整数的glfwSetErrorCallback传入cout会输出整数?

问题原因说明

这个现象是C++标准库std::cout的输出规则导致的,和GLFW的返回值逻辑无关,具体原因如下:

  1. 首先确认GLFW的接口定义没有问题:glfwSetErrorCallback的返回值确实是GLFWerrorfun类型,也就是你查到的函数指针类型,返回值为上一次注册的回调函数指针,首次注册无历史回调时返回NULL,符合官方描述。
  2. 你看到的0/1输出是std::ostream的operator<<隐式类型转换的结果:
    • C++标准库没有为函数指针类型提供<<运算符的重载,当你直接把函数指针传给std::cout时,编译器会自动把函数指针隐式转换为bool类型。
    • 空指针转换为bool值为false,输出时显示为0;非空的函数指针转换为bool值为true,输出时显示为1。
  3. 对应你的测试代码逻辑:
    • 第一次调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:36:08