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);
在上述兩所不同的僅僅是__stdcall控制使用的調用約定。創建的彙編代碼以一種稱爲stdcall調用約定的方式執行函數調用。詳細信息可在[此處](http://msdn.microsoft.com/en-us/library/zxk0tw93(v = vs.80).aspx)。它是一個MS擴展,它確保事情得到正確傳遞。是的,其他人將其定義爲不需要它的平臺上省略它。 – Nerdtron
所以基本上所有的代碼宏(是宏的複數?)導致唯一的標準C++關鍵字是extern,其餘的是微軟特定的東西,與C++無關,但目標是MS編譯器? – dtech
@ddriver基本上,是的。 – zerm