Специфичные для платформы макросы в заголовках OpenGL - PullRequest
2 голосов
/ 08 декабря 2011

Я анализировал 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 Ответ

1 голос
/ 15 февраля 2012

Вы можете использовать препроцессор для этой задачи примерно так:

gcc --nostdinc -E -DGLAPI="" -DAPIENTRY="" yourHeader.h > cleanedFile.h
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...