0

次の関数では、コールバック関数start_routineの戻り値の型はvoid **

 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
               void *(*start_routine) (void *), void *arg);

しかし、コールバック関数を定義すると、次のようになります。

void func(void *)

私はそれが関数であることを知っていますが、少なくともコールバック関数は次のようになるべきだと思いました:

void* func(void *);

どこが間違っていますか?ありがとう!

4

1 に答える 1

0

void func(void *)何も返さず、void*. 関数の引数として配置することはできません。

void* func(void *)void*上記と似ていますが、唯一の違いはポインタを返すことです。

コールバック関数は次のようになりますreturn_type (*function_name)(arguments)。ここでは、例を示しますvoid* (*start_routine)(void *)。これは有効な関数引数です。

このpthread_create関数は、最後の 2 番目の引数として、start_routine戻り値の型がvoid*であり、 type の引数を 1 つだけ持つ関数へのポインターを受け取りますvoid*

このページからの抜粋: http://www.cprogramming.com/tutorial/function-pointers.html

より多くの星が投入されると、人々は混乱することがあります。

void *(*foo)(int *);

ここで重要なのは、裏返しに読むことです。*foo式の最も内側の要素はであり、それ以外は通常の関数宣言のように見えることに注意してください。*fooを返し、void*を取る関数を参照する必要がありint*ます。したがって、foo はまさにそのような関数へのポインターです。

于 2013-07-05T17:40:53.980 に答える