私はgl.hを解析していましたが、私はopenGL関数を宣言する方法としては(少なくとも私にとって)非常に珍しいことに気付きました。次に例を示します。OpenGLヘッダーのプラットフォーム固有のマクロ
GLAPI void APIENTRY glEvalCoord1d(GLdouble u);
GLAPI void APIENTRY glEvalCoord1f(GLfloat u);
GLAPI void APIENTRY glEvalCoord1dv(const GLdouble *u);
は明らかに、これらは、戻り値の型ボイドとの定期的な機能ですが、私の質問は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は基本的にWin32のAPIとDLLを処理するためのMSのものであることを知っていましたが、私は "extern"の意味を知っていますが、APIENTRYではwin32のバージョンは__stdcallですが "else"何にもAPIENTRYを定義しているようですが、それはAPIENTRYを単に何かで置き換えるという意味ですか?
void glEvalCoord1d(GLdouble u);
__stdcall void __stdcall glEvalCoord1d(GLdouble u);
上記の二つの違いは、単に__stdcallたコントロールの2つの違いは何ですか
使用される呼び出し規約。作成されたアセンブリコードは、stdcall呼び出し規約として知られている方法で関数呼び出しをexcecuteします。詳細はこちら[こちら](http://msdn.microsoft.com/en-us/library/zxk0tw93(v = vs80).aspx)をご覧ください。物事が適切に受け継がれるようにするMSエクステンション。はい、elseは、それを必要としないプラットフォームでは省略されたことを何も意味しません。 – Nerdtron
基本的にすべてのコードのマクロ(マクロのための複数形ですか?)は、唯一の標準C++キーワードの結果ですextern、残りはC++とは関係がないがMSコンパイラをターゲットとするMicrosoft特有のものですか? – dtech
@ddriver基本的にはい。 – zerm