0

次の関数宣言に出くわしましたが、それがどのように機能するかを正確に理解できません。関数はファイルで次のように宣言されています。

struct newtype {
  /* some definition */
};

typedef void function1 (int* a, newtype* p);

次に、上記の別のCコードでは、宣言を使用して別のfunction2を次のように宣言します。

function1 function2;

void function2(int* a, newtype* p)
{ 
  /* function definition */  
}

次に、function2は次のように使用されます。

int function3 (int, char, function1* );

/* definition */
function3(int a, char c, function2 )
{ 
  /* function definition */
}

私はステートメントを理解することができません:function1 function2; また、function1がポインターとして宣言されていないため、typedef void function1(引数)は何を意味しますか。誰かがここで何が起こっているのか説明できますか?

4

2 に答える 2

1

function1は、何も返さず、intへのポインターとnewtypeへのポインターを引数として取る関数の型として宣言されています。

この方法は、特にコールバック関数/関数ポインターを使用する場合に、特定の形式に準拠する関数を確実に取得するのに役立ちます。

于 2012-08-09T17:26:02.093 に答える
0
 typedef void function1 (int* a, newtype* p);

名前function1void ()(int *, newtype *)をタイプ、つまり関数のエイリアスとして定義します。

したがってfunction1 function2;、このプロトタイプと同じです。

void function2 (int* a, newtype* p);

この名前function1を使用してポインターを宣言することもできます。これにより、おなじみの「関数ポインター」が作成されます。これが、function3が宣言するときに実行していることですint function3 (int, char, function1* );。最後の引数は、シグネチャを持つ関数へのポインタです。void ()(int *, newtype *)

于 2012-08-09T17:33:44.350 に答える