在openGL中注册回调时出现编译错误

Compilation error when registering callbacks in openGL

本文关键字:编译 错误 回调 openGL 注册      更新时间:2023-10-16

我刚刚开始学习openGL几个小时前为我的工作,并已完成了使用镶嵌渲染凹多边形的任务。我正在尝试编译以下代码:

#ifndef CALLBACK
#define CALLBACK
#endif
#include "GL/gl.h"
#include "GL/glu.h"
void CALLBACK beginCallback(GLenum which);
void drawHook()
{
   GLUtesselator* tessObj = gluNewTess();
   gluTessCallback(tessObj, GLU_TESS_BEGIN, beginCallback);
}
void CALLBACK beginCallback(GLenum which)
{
    glBegin(which);
}

是我从OpenGL编程指南第七版中获得的,相关章节也可以在网上找到。但是返回以下错误:

hook.cc:28: error: invalid conversion from ‘void (*)(GLenum)’ to ‘void (*)()’
hook.cc:28: error: initializing argument 3 of ‘void gluTessCallback(GLUtesselator*, GLenum, void (*)())’

这个错误使我相信gluTessCallback的第三个参数应该是一个不接受参数的函数,但"官方"openGL参考声明不然。

是我遗漏了什么还是书不正确?

这本书是正确的。您只需要将函数指针强制转换为void(*)()。这是必需的,因为类型不是(也不可能是)精确的。

gluTessCallback(tessObj, GLU_TESS_BEGIN, (void(*)())&beginCallback);

您链接的文档说明gluTessCallback的第三个参数是一个无参数函数。(在标题镶嵌回调例程之后)

但是,例11-1将实际的函数指针强制转换为无参数指针:
gluTessCallback(tobj, GLU_TESS_ERROR, (GLvoid (*) ()) &errorCallback);
                                      ^^^^^^^^^^^^^^^