我在解析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宏的作用。这两个是特定于平台的,在 header 的开头声明:
/* 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

我想制作一个遍历 header 并列出其内容的代码解析器,所以我的问题是如何处理这些宏以及如何使用它们。

我对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 );

最佳答案

您可以将预处理器用于此任务,如下所示:

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

09-27 21:13