2012-10-24 31 views
2

我正在編寫一個跨平臺的OpenGL函數加載庫。在Windows上,編譯器(奇怪的是,VS GCC)似乎很好,將一種函數指針(來自wglGetProcAddress的返回類型是void(*)())隱式轉換爲另一種類型的函數指針。存儲函數指針時禁止GCC警告

GCC Linux但是不是。 glXGetProcAddress將返回void(*)(),但它會一直髮出警告。而且由於OpenGL具有數以千計的這些功能,因此它增加了一個完全不相關的巨大診斷功能。

是否有某種方法可以禁用此特定警告?要麼使用#pragma,要麼重新排列代碼以便GCC關閉?我嘗試了整個#pragma diagnostic ignore -Wblahblah,但我找不到與我得到的警告相匹配的「blahblah」。

+0

作爲一個附註,你可能想看看http://glew.sourceforge.net/來處理加載所有這些 – hexist

+0

或許'gcc -w'? – 2012-10-24 17:45:37

+1

@hexist:是的,我正在嘗試[*替換* GLEW](https://bitbucket.org/alfonse/glloadgen/wiki/Home),而不是使用它。 –

回答

3

我敢肯定,你應該使用提供的宏來獲取正確的類型。例如,從gl3w OpenGL擴展裝載機採取(你需要運行python腳本得到它產生這樣的代碼),它看起來像行:

gl3wBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC)get_proc("glBindImageTexture"); 

,在中東怪異PFNGLBINDIMAGETEXTUREPROC是宏爲glBindImageTexture功能的正確功能類型(您可以看到它的名字實際上是P ointer F unctio NGLBINDIMAGETEXTUREPROC)。

+1

我不是C程序員,但是C程序員告訴我,在C中做不必要的顯式轉換是不好的。你應該讓隱式轉換系統處理它。 –

+1

@Nicol:我不確定你在哪裏學到了。在C中,通常應避免顯式地將'void *'強制轉換爲其他指針類型(例如'malloc'的返回值),因爲存在從'void *'到任何其他數據指針類型的隱式轉換。然而,*函數*指針是完全不同的野獸 - 沒有隱式的函數指針轉換,所以你應該在需要的時候明確地進行轉換(這不應該太頻繁,但是這看起來像是一個很好的例子)。 –