2012-01-17 24 views
2

私はCにかなり新たなんだ、と私は本当に苦労のコード行を読んで、それを理解することだ:見回しからCで関数ポインタを持つtypedef?

typedef void (*getnxtbyte_t)(void *stream); 

を、私は今、それが指し示すポインタのためのものであることを知っています機能。しかし、誰も私がこれをさらに明確にするのを助けることができますか?この新しいタイプの名前は何ですか?それはどのような機能を指していますか?関数のパラメータは(void* stream)ですか?

ありがとうございます!

+0

[この回答](http://stackoverflow.com/a/8249710/968261)にリンクされている記事をご覧ください。 –

+0

[このC文の意味は何ですか?](http://stackoverflow.com/questions/8249483/what-does-this-cstatement-mean) –

答えて

5

慣れてしまうのは難しい構文です。

この新しいタイプの名前は何ですか?

タイプはgetnxtbyte_tです。 (あなたは、「タイプ」として_tを末尾。それは人気が慣例だと読むことができます。)

タイプgetnxtbyte_tの変数を1つのvoid *のパラメータを取り、タイプvoidを返している関数のアドレスを保持することができます。

どのような機能ですか?

間違った質問。

そのコードはと入力してください。タイプはです。変数は作成されないので、何かを指す「それ」はありません。

void some_func(void*) {} 

あなたは今ではtypedefを使用して、それへのポインタを作成することがあります。:あなたのような、正しいシグネチャを持つ関数をご存知の場合

getnxtbyte_t my_function_pointer = some_func; 
1

これtypedefと呼ばれる型を作成しますgetnxtbyte_t。この型は、2番目の単語に示すように、void(つまり何も返さない)を返す関数へのポインタ用です。その関数はvoid *という単一のパラメータをとり、streamで示されます。

あなたはこのような宣言と機能を持っていたのであれば:関数ポインタ型名はgetnxtbyte_tある

void *some_param = NULL; 
typedef void (*getnxtbyte_t)(void *stream); // declare typedef 
getnxtbyte_t func = some_function; // assign 
func(some_param); // call 
0

void some_function(void *any_name); 

次に、あなたのポスト内の1つのようtypedefを使用することができます。これは現在何も指していません - タイプのポインタです。実際のポインタではありません。それはちょうどあなたがタイプFooが、そのタイプの実際のインスタンスを定義

typedef struct foo {int x;} Foo; 
を言うようなものです。最後に、関数は単一の void*引数をとり、 voidを返します。

0

私はC言語も新しくなっていますので、間違いがある場合は私を修正してください。


関数を指すポインタがそのようにようにフォーマットされる:

datatype (*POINTER_NAME)(PARAMETERS); 

だから尖った関数戻り、ポインタの名とパラメータデータ型指示された関数が必要です。ここで


は、通常の関数の宣言に比べて関数ポインタがどのように見えるかです:

// normal function declaration 
void getnxtbyte_t(void *stream); 

// function pointer 
void (*getnxtbyte_t)(void *stream); 


typedef私たちは私たち自身の型を作成することができます。この時点で

// will create a type called getnxtbyte_t 
typedef void (*getnxtbyte_t)(void *stream); 


は、我々は唯一のタイプを宣言しました。私たちは何も指していません。だから、func_ptrという名前のポインタを作成し、それを関数に向けましょう。

// func_ptr is a pointer of type getnxtbyte_t 
getnxtbyte_t func_ptr = another_function; 

// calling func_ptr is now the same as calling another_function 
func_ptr(an_argument); 

// had we not used typedef, we would type: 
void (*getnxtbyte_t)(void *stream) = another_func; 
getnxtbyte_t(an_argument); 
関連する問題