![](/img/trans.png)
[英]error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’ - pthreads
[英]error: invalid conversion from 'void (*)()' to 'void (*)()' — what?
我試圖將回調函數從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:在我看來,我遇到了一個關於GLAPIENTRY
, APIENTRY
和_GLUfuncptr
的凌亂的OpenGL問題。 以下是關於可移植性問題的非常長的討論:
http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/2007-October/003023.html
如果這就是你所得到的錯誤,這是一個非常糟糕的消息。 這是調用約定的問題。
從我的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規范只是指定接受void (*func)()
。 由於某些實現需要_GLUfuncptr
,其中包括GLAPIENTRY
要求,但其他實現根本沒有定義GLAPIENTRY
,因此這里存在可移植性問題。
可能的解決方法可能是:
#ifndef GLAPIENTRY
#define GLAPIENTRY
#endif
並使用GLAPIENTRY
宏聲明所有回調。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.