11

私は初めてで、C ++(Javaをたくさん知っている)を学び、次のコードは私を混乱させます...

ここに画像の説明を入力してください

このコードフラグメントが関数へのポインター(これは意味のあるコールバックです)を処理していることは知っていますが、私を驚かせているのは、戻り型と関数名の間の引数です。血まみれの地獄は何ですか?

ある種の関数のように見えますが、そのことは聞いたことがなく、関数へのポインタについて検索して読んだ後でも、関数に型がある可能性があることについて言及しているものは何も見つかりませんでした。

これが当てはまる場合、関数型をどのように定義しますか?

ありがとう、-Cody

4

4 に答える 4

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では、正しい呼び出し規約を使用することが重要です。これは、スタックが呼び出し先によってクリーンアップされることを期待しているものと、呼び出し元によってクリーンアップされることを期待しているものがあるためです。引数を渡す順序にも違いがある場合があります。

于 2012-12-07T19:00:20.563 に答える
9

WindowsではGLFWCALL、はのマクロで__stdcallあり、他のプラットフォームでは、それは無料のマクロです。

__stdcall特定の呼び出し規約を実装し、通常のCまたはC++に加えてコンパイラ拡張機能です。

マクロは、コンパイラのレクサーとパーサーがマクロと対話する前に、コードを置換するコードの断片です。

于 2012-12-07T18:59:14.933 に答える
6

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

于 2012-12-07T18:59:25.907 に答える
1

関数シグネチャの一部としてマークされている質問は、ヘッダーの別の場所で定義されているプリプロセッサマクロです。特定のプラットフォームの特定の機能には、追加の要件があります。

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

この特定のケースでは、マクロが空白であるかのように見せかけて、完全に無視することができます。

于 2012-12-07T19:10:03.283 に答える