gpt4 book ai didi

c++ - 错误 : invalid conversion from 'void (*)()' to 'void (*)()' -- what?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:05 25 4
gpt4 key购买 nike

我正在尝试将回调函数从 C++ 传递到 OpenGL (C API):

gluQuadricCallback(qobj, GLU_ERROR, errorCallback);

其中 errorCallback 是编译为 C++ 代码的文件中的函数,声明为

void errorCallback();

代码在 Linux 上使用 g++ 4.4 编译干净,但在 Windows 上使用 mingw32 g++ 4.4 时出现以下错误:

..\glwidget.cpp:172: error: invalid conversion from 'void (*)()' to 'void (*)()'

..\glwidget.cpp:172: error: initializing argument 3 of 'void gluQuadricCallback(GLUquadric*, GLenum, void (*)())'

这是某种 C 和 C++ 混合问题吗?我该如何解决这个问题?

更新: void GLAPIENTRY errorCallback(); 也不编译 :(
..\glwidget.cpp:129: 错误:'errorCallback' 之前的预期初始值设定项
现在几乎可以肯定这是一个调用约定问题并且与 C 链接无关,请参阅 Thomas 回答下方的评论。

更新 2: 在我看来,我只是遇到了一个关于 GLAPIENTRYAPIENTRY_GLUfuncptr 。这是关于可移植性问题的非常长的讨论:
http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/2007-October/003023.html

最佳答案

如果这就是您得到的所有错误信息,那这就是一条非常糟糕的消息。这是调用约定的问题。

来 self 的glu.h:

GLAPI void GLAPIENTRY gluQuadricCallback (GLUquadric* quad, GLenum which, _GLUfuncptr CallBackFunc);

_GLUfuncptr 定义为:

typedef void (GLAPIENTRYP _GLUfuncptr)();

#ifndef GLAPIENTRYP
#define GLAPIENTRYP GLAPIENTRY *
#endif

#ifndef GLAPIENTRY
#if defined(_MSC_VER) || defined(__MINGW32__)
#define GLAPIENTRY __stdcall
#else
#define GLAPIENTRY
#endif
#endif

这解释了 Linux 和 mingw 之间的区别。

据此,您认为您需要将回调声明为

void GLAPIENTRY errorCallback();

并且 __stdcall 将在适当的时候被打上它。

但是,正如 Ali 在下面的评论中指出的那样,将 GLAPIENTRY 添加到回调签名上并不总是有效。似乎 GLU 1.3 spec简单地指定一个 void (*func)() 被接受。由于一些实现需要 _GLUfuncptr 代替,其中包括 GLAPIENTRY 要求,但其他实现根本不定义 GLAPIENTRY,因此存在可移植性问题在这里。

可能的解决方法是:

#ifndef GLAPIENTRY
#define GLAPIENTRY
#endif

并使用 GLAPIENTRY 宏声明所有回调。

关于c++ - 错误 : invalid conversion from 'void (*)()' to 'void (*)()' -- what?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5028833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com