Платформо-зависимые макросы в заголовках OpenGL
Я анализировал 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 );
1 ответ
Для этой задачи вы можете использовать препроцессор, например:
gcc --nostdinc -E -DGLAPI="" -DAPIENTRY="" yourHeader.h > cleanedFile.h