Платформо-зависимые макросы в заголовках 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
Другие вопросы по тегам