OpenGL头文件中平台特定的宏
Platform specific macros in OpenGL headers
我正在解析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基本上是MS的东西来处理win32 api和dll,我知道"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
相关文章:
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- 如何基于平台在制作文件中制作if语句?
- 如何使用可视化代码和平台IO将环境变量注入CPP文件?
- 组织项目的多平台和易于使用的文件
- 如何打开和读取16位.raw文件Vc++(Wince 平台)
- 程序'main.exe'运行失败:指定的可执行文件不是此操作系统平台的有效应用程序
- 在没有节点GYP的目标平台上编译C/C 文件
- 如何从平台SDK明确包含标头文件
- 如果给定正确的运行时库,x86 可执行文件是否可以在任何 x86 平台上运行
- 如何实现独立于平台的异步文件写入
- C++:如何保存独立于平台的二进制文件
- 在任何平台上执行任何Qt5应用程序的重要dll文件是什么(运行时文件dll)
- VS2010在不同平台上生成的可执行文件是否应该有所不同
- 部署Qt-dll文件-找不到windows插件,尽管平台/qwindows.dll存在,因此存在libEGL和libGL
- VS2013 C++:忽略平台包含文件夹
- Visual Studio 2013 在使用 VS 2010 平台工具集时找不到头文件
- C++标准库在任何时候都包括每个平台的原生头文件吗
- 包括具有一个头文件和独立源文件的特定于平台的库
- 对于多个平台,头文件是相同的还是不同的
- 如何在Windows平台中获取远程Windows服务器的共享文件夹的文件列表