簡體   English   中英

錯誤:從'void(*)()'到'void(*)()'的轉換無效 - 什么?

[英]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:在我看來,我遇到了一個關於GLAPIENTRYAPIENTRY_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM