我正在解析gl.h文件时,注意到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"的意思,但是在win32版本中,APIENTRY是__stdcall,这个我懂,但是另外一种情况似乎没有定义APIENTRY为任何东西,这是什么意思呢?
这两者之间有什么区别:
void glEvalCoord1d( GLdouble u );
__stdcall void __stdcall glEvalCoord1d( GLdouble u );