私が正しく理解していれば、xyz
がabc
に渡される関数になりますか?
void xyz(void *p);
そして:引数my_func
が示すように
は、あなたが引数としてvoid *
を取り、void
type (*func_pointer)(type, type, type, .......)
^^ ^ ^ ^ ^
| | | | | |
| | | argument types
| | pointer name
| This is a function pointer
return type
はそのため、あなたにxyz
を宣言する必要が返す関数へのポインタを持っています同じ実装:
void xyz(void *p){
statements;
}
あなたが間違っているのは、.hファイルに書いた行がxyz
という名前の関数ポインタを定義しているということです。あなたはxyz = some_function;
を書いたことがないので、関数ポインタを使用すると、ソースファイルに記述されているもの、値を持たない入力としてvoid *
を取り、あなたの意図だったvoid *
、代わりのvoid
を返すも名前xyz
の関数であり、 。
あなたがint *x;
を書き、x
がint
へのポインタです:
は、たぶん、これはあなたがあまり混乱して得ることができます。次にint y;
には*
がなく、x = &y;
と書かれています。
機能と同じです。 void (*funcptr)(void *p);
がある場合は、void some_func(void *p){}
(やはり余分な数字は*
なし)と書かれた関数があり、funcptr = some_func;
と書いてください。 &
は実際には関数名が関数のポインタであるため、必要ありません。あなたはもっと明示的にそれを置くことができます。
void xyz(void *p);
void xyz(void *p){
// ...
}
とは、APIへのポインタを渡します:適切な場合には
abc(xyz, 42, 7);
関数名が自動的に関数ポインタとして解釈されますが、他のと同じように
私はこれを 'typedef void(* my_func_ptr)(void *);'と呼ぶことがあります。 –
はい、私もそうです。しかし、 'my_func_t my_func_impl;でこのトリックはもうできません。私は編集します。 – glglgl
違反はありませんが、自分自身を含む多くのプログラマーは 'my_func_t my_func_impl;'を見て、それがグローバル変数であり、おそらく関数ポインタだと思います。それはプログラマーではなく、コンピューターのための良い例です。このような手口は、[Linuxカーネルの 'typedef'に対する厳しい制限(http://www.kernel.org/doc/Documentation/CodingStyle)(第5章「Typedefs」)をもたらしました。 –