0

Enlightenmentのコードを読んでいると、CIについて理解できないことがいくつかありました。行を貼り付けて、なぜそれがはっきりしないのかを説明します。

Eina_Bool (*hide)(void *data, Evas_Object *o);
void (*del)(void *data, Evas_Object *o);

これについて、括弧内のポインタ値は、戻り値の直後とはどういう意味ですか?また、両方の関数の最初のパラメーターがであることに注意してくださいvoid *data。これは、任意のタイプのデータへのポインターを関数に渡すことができることを意味しますか?

EAPI Ecore_X_Window elm_win_xwindow_get(const Evas_Object *obj);

APIのほとんどすべての関数は。で始まりますEAPI。どういう意味ですか?それは一種の名前空間ですか?それに関する情報はどこにありますか?

また、ライブラリの1つであるElementaryをどのように使用しているかにも注目してください。

EAPI_MAIN int elm_main(int argc, char **argv) {
    // CODE
}
ELM_MAIN()

main関数を使用する代わりに、そのelm_mainをこれらの大文字のフラグとともに使用しますEAPI_MAIN。そして、関数の直後には、ELM_MAIN()セミコロンのない奇妙なものがあります。

初めて見たときに奇妙に思えたこれらすべてについて少し説明していただければ幸いです。

注:貼り付けた例はすべて、elm_win.hElementaryヘッダーからのものです。

4

3 に答える 3

2

ここに表示されている行は、関数ポインター変数の宣言です。

フォームの行:

int (*foo)(int x)

xたとえば、1つの整数引数( )を取り、整数を返す関数(のアドレス)を保持できるfooという変数を宣言します。このような関数を宣言する場合:

int twice( int x )
{
    return x*2;
}

その関数(のアドレス)を変数fooに割り当てることができます。

foo = twice;

twice次に、ポインタを介して関数を呼び出すことができます。

int result = foo( 3 );

result6が含まれるようになります)

このようなことをする通常の理由は、コード内の特定のポイントで関数を呼び出したいことがわかっているが、正確にはどの関数が他のコードに依存するかということです。関数が呼び出されprocess_Aprocess_Bそのうちの1つを関数変数に割り当てる場合:

int (*process)(int x);
process = using_b ? process_B : process_A;
... more code ...
result = process( some_value );

ここで、結果は、割り当てられた値に応じて、process_Aまたはによって計算された値に設定されます。process_Bprocess

もちろん、呼び出しの時点で条件を使用することもできますが、関数を選択してそれ(またはそのアドレス)を変数に格納すると、より効率的で(より重要な)より明確なコードになります。

シンボルについてはEAPI...Enlightenmentはわかりませんが、それはヘッダーで定義されたマクロであると思います。ビルドオプションに応じて、呼び出し規約を変更したり、シンボルをエクスポートしたりする可能性があります。

于 2012-10-20T18:00:13.847 に答える
0

これらの最初の2つのステートメントは、関数ポインター定義です。つまり、関数のアドレスをとるポインタ変数。

タイプはvoid *、任意の有効なポインタ値またはnullポインタを受け入れることができます。void *ポインタが指している実際の型をなんとかして追跡し、void *その背後にある実際の型に適切に型キャストすることが必須です。これの一般的な使用法は、任意のユーザー入力データをコールバック関数に渡す手段を提供することです。そして、それが2つの関数ポインターの目的です。

この文

Eina_Bool (*hide)(void *data, Evas_Object *o);

意味:hidevoid *は、パラメーターa 、aを受け入れ、aEvas_Object *を返す関数へのポインターEina_Boolです。

これは、微妙に異なるステートメントとは大幅に異なることに注意してください

Eina_Bool* reveal(void *data, Evas_Object *o);

revealこれは、を返すという名前の関数になりますEina_Bool*

于 2012-10-20T17:50:37.133 に答える
0

私はこのソースが定義しているのを見つけましたEAPI

#ifdef _WIN32
# ifdef EFL_EFX_BUILD
#  ifdef DLL_EXPORT
#   define EAPI __declspec(dllexport)
#  else /* ifdef DLL_EXPORT */
#   define EAPI
#  endif /* ! DLL_EXPORT */
# else /* ifdef EFL_BUILD */
#  define EAPI __declspec(dllimport)
# endif /* ! EFL_BUILD */
#else /* ifdef _WIN32 */
# ifdef __GNUC__
#  if __GNUC__ >= 4
#   define EAPI __attribute__ ((visibility("default")))
#  else /* if __GNUC__ >= 4 */
#   define EAPI
#  endif /* if __GNUC__ >= 4 */
# else /* ifdef __GNUC__ */
#  define EAPI
# endif /* ifdef __GNUC__ */
#endif /* ! _WIN32 */

これらはすべてコンパイラフラグです。

さて、あなたhidedel質問について。これらは関数ではなく、関数ポインタです。つまり、逆参照するdelと、次のタイプの関数が得られます。

void del_impl(void *data, Evas_Object *o);

これにより、オンラインデータに基づいて、呼び出す関数を実行時に選択できます。

于 2012-10-20T17:52:20.933 に答える