2012-12-07 32 views
11

私は、このコード・フラグメントは、関数へのポインタを扱っている知っている...C++関数タイプ?

enter image description here

に新たなんだ、とC++を学ぶ(のJavaをたくさん知っている)、次のコードは、私を混乱させる(これはコールバックですが、意味がありますが)私を捨てているのは、戻り値の型と関数名の間の引数です。それは何なの?

これは関数のように見えますが、私はこれまで聞いたことがなく、関数へのポインタを検索して読み込んだ後でも、その関数が型を持つことがあるということを見つけることができませんでした。

これが当てはまる場合、どのように機能タイプを定義しますか?

+2

この本は何ですか?そしてそのコードはC++よりもCに近く見えます(OpenGLの本のように思えますが、それは私を驚かせません)。 –

+1

これはstdcall/fastcall/regcallのように呼び出し規約ではありませんか? –

+0

いくつかのコンパイラでは、呼び出し規約で注釈を付けます。 – rerun

答えて

10

GLFWCALLは型ではなく、プラットフォーム固有の呼び出し規約または空の文字列に展開されるマクロです。ここglfw.hのトリミングの断片です:それらのいくつかは、スタックは、呼び出し側によって呼び出し先などで清掃することを期待するので、

#if defined(_WIN32) && defined(GLFW_BUILD_DLL) 
#define GLFWCALL  __stdcall 
#elif defined(_WIN32) && defined(GLFW_DLL) 
#define GLFWCALL  __stdcall 
#else 
/* We are either building/calling a static lib or we are non-win32 */ 
#define GLFWCALL 
#endif 

正しい呼び出し規約を使用するには、x86の/ Win32の上で重要です。引数を渡す順序にも違いがあります。

+0

いくつかの呼び出し規約(<4引数のfastcall)はスタックをまったく使用しないことに注意してください。 –

+1

* fastcallにも左右されます:) MS fastcallはecxとedxを使用し、Borlandはeax/edx/ecxを使用し、Watcomは4つのeax/edx/ebx/ecxを使用します。 –

+0

WAT? fastcallにはさまざまなバージョンがありますが、すべてfastcallと呼ばれていますか? –

9
Windowsでは

GLFWCALL -Cody

おかげで、__stdcallのマクロであり、他のプラットフォーム上で、それが何のためのマクロです。

__stdcallは、特定の呼び出し規約を実装しており、通常のCまたはC++の上にあるコンパイラ拡張です。

マクロは、コンパイラのレクサーとパーサーが相互作用する前にコードに置き換えられるコードです。

6

GLFWCALLは、必要に応じてcalling conventionに展開できるマクロです。この関数は外部コードによって呼び出されるため、外部コードが要求する呼び出し規約を使用する必要があります。例えば、関数がその戻り値をスタックに置き、外部コードがそれをレジスタに期待すると、ブームが発生します。

1

関数シグニチャの部分は、ヘッダーのどこかで定義されているプリプロセッサマクロです。特定のプラットフォームの特定の機能には、追加の要件があります。

たとえば、WindowsプラットフォームのDLLファイルの関数では、__declspec(dllexport)修飾子を使用することがよくありますが、同じヘッダーがユーザーのプロジェクトに含まれている場合は、__declspec(dllimport)を使用する必要があります。この目的のためにプリプロセッサマクロを使用すると、関連するすべての関数でそのマクロを使用するだけで、独自のDLLやユーザーのDLLをコンパイルするときや、__declspecが無関係なプラットフォームでマクロを異なる定義することができます。そのようなマクロには他にも多くの理由があります。

この特定のケースでは、効果的にマクロが空白であると見せかけ、それを完全に無視することができます。