2011-12-08 13 views
2

私は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); 
+1

上記の二つの違いは、単に__stdcallたコントロールの2つの違いは何ですか

使用される呼び出し規約。作成されたアセンブリコードは、stdcall呼び出し規約として知られている方法で関数呼び出しをexcecuteします。詳細はこちら[こちら](http://msdn.microsoft.com/en-us/library/zxk0tw93(v = vs80).aspx)をご覧ください。物事が適切に受け継がれるようにするMSエクステンション。はい、elseは、それを必要としないプラットフォームでは省略されたことを何も意味しません。 – Nerdtron

+0

基本的にすべてのコードのマクロ(マクロのための複数形ですか?)は、唯一の標準C++キーワードの結果ですextern、残りはC++とは関係がないがMSコンパイラをターゲットとするMicrosoft特有のものですか? – dtech

+0

@ddriver基本的にはい。 – zerm

答えて

1

あなたはこのようなもので、このタスクのためのプリプロセッサを使用することができます:

gcc --nostdinc -E -DGLAPI="" -DAPIENTRY="" yourHeader.h > cleanedFile.h 
関連する問題