C++ OpenGL标题中特定于平台的宏

C++ OpenGL标题中特定于平台的宏,c++,function,opengl,header,declaration,C++,Function,Opengl,Header,Declaration,我正在解析gl.h,我注意到一种非常不寻常的(至少对我来说)声明openGL函数的方式。以下是一个例子: GLAPI void APIENTRY glEvalCoord1d( GLdouble u ); GLAPI void APIENTRY glEvalCoord1f( GLfloat u ); GLAPI void APIENTRY glEvalCoord1dv( const GLdouble *u ); 显然,这些是返回类型为void的正则函数,但我的问题是关于GLAPI和apicent

我正在解析gl.h,我注意到一种非常不寻常的(至少对我来说)声明openGL函数的方式。以下是一个例子:

GLAPI void APIENTRY glEvalCoord1d( GLdouble u );
GLAPI void APIENTRY glEvalCoord1f( GLfloat u );
GLAPI void APIENTRY glEvalCoord1dv( const GLdouble *u );
显然,这些是返回类型为void的正则函数,但我的问题是关于GLAPI和apicentry宏的效果。这两个是特定于平台的,在标题开头声明:

/* 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++是相当陌生的,所以那些不规则的函数声明对我来说并不熟悉。我发现uu declspec(dllimport)和u stdcall基本上是处理win32 api和DLL的MS工具,我知道“extern”是什么意思,但对于APIEnth来说,win32版本是我得到的u stdcall,但“else”似乎没有定义APIEnth的任何内容,这是否意味着它只是将APIEnth替换为零

两者的区别是什么:

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

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

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

以上两种方法的区别只是控制调用约定的stdcall。创建的汇编代码以一种称为stdcall调用约定的方式执行函数调用。详情可查。它是一个MS扩展,可以确保正确地传递消息。是的,其他的定义它什么都没有,这意味着它在不需要它的平台上被省略了。所以基本上所有的宏代码(宏的复数)都导致唯一的标准C++关键字是Extn,剩下的是微软特定的东西,它们与C++无关,而是以MS编译器为目标?stdcall调用约定是一个标准的东西,MS扩展只提供了一个关键字,允许您强制执行该调用约定。“我想做一个代码解析器,它遍历头并列出它们的内容”,我强烈建议不要这样做。阅读用于生成OpenGL标题的.spec文件要比执行您正在执行的操作容易得多。事实上,我已经有一些将OpenGL的定义收集到XML文件中以便于处理。