2011-12-08 29 views
2

我正在解析gl.h,並且我注意到一種非常不尋常的(至少在我身上)聲明openGL函數的方法。這裏有一個例子:OpenGL頭文件中的特定於平臺的宏

GLAPI void APIENTRY glEvalCoord1d(GLdouble u); 
GLAPI void APIENTRY glEvalCoord1f(GLfloat u); 
GLAPI void APIENTRY glEvalCoord1dv(const GLdouble *u); 

顯然,這些都是與返回類型爲void定期的功能,但我的問題是關於GLAPI和APIENTRY宏的效果。這兩個是特定於平臺的,在頭的開始宣稱:

/* GLAPI, part 1 (use WINGDIAPI, if defined) */ 
#if defined(__WIN32__) && defined(WINGDIAPI) 
# define GLAPI WINGDIAPI 
#endif 

/* GLAPI, part 2 */ 
#if !defined(GLAPI) 
# if defined(_MSC_VER)      /* Microsoft Visual C++ */ 
# define GLAPI __declspec(dllimport) 
# elif defined(__LCC__) && defined(__WIN32__) /* LCC-Win32 */ 
# define GLAPI __stdcall 
# else          /* Others (e.g. MinGW, Cygwin, non-win32) */ 
# define GLAPI extern 
# endif 
#endif 

/* APIENTRY */ 
#if !defined(APIENTRY) 
# if defined(__WIN32__) 
# define APIENTRY __stdcall 
# else 
# define APIENTRY 
# endif 
#endif 

我想打一個代碼分析器,通過頭去,並列出它們的內容,所以我的問題是如何處理這些宏和什麼從中解脫出來。

我對C++來說相當新,所以那些不規則的函數聲明對我來說並不熟悉。我發現__declspec(dllimport)和__stdcall基本上是用來處理win32 API和DLL的MS東西,我知道什麼是「extern」,但對於APIENTRY,win32版本是我得到的__stdcall,但「else」不似乎將APIENTRY定義爲任何內容,這是否意味着它僅僅用APIENTRY替代一切?

兩者有什麼區別:

void glEvalCoord1d(GLdouble u); 
__stdcall void __stdcall glEvalCoord1d(GLdouble u); 
+1

在上述兩所不同的僅僅是__stdcall控制使用的調用約定。創建的彙編代碼以一種稱爲stdcall調用約定的方式執行函數調用。詳細信息可在[此處](http://msdn.microsoft.com/en-us/library/zxk0tw93(v = vs.80).aspx)。它是一個MS擴展,它確保事情得到正確傳遞。是的,其他人將其定義爲不需要它的平臺上省略它。 – Nerdtron

+0

所以基本上所有的代碼宏(是宏的複數?)導致唯一的標準C++關鍵字是extern,其餘的是微軟特定的東西,與C++無關,但目標是MS編譯器? – dtech

+0

@ddriver基本上,是的。 – zerm

回答

1

您可以使用預處理完成這個任務,像這樣的東西:

gcc --nostdinc -E -DGLAPI="" -DAPIENTRY="" yourHeader.h > cleanedFile.h