関数ポインターの疑い
-
06-07-2019 - |
質問
指定された関数の呼び出しが何を返すか、どのように教えてください。コード:
typedef struct {
int size;
ptrdiff_t index;
void (*inlet) ();
int argsize;
ptrdiff_t argindex;
} CilkProcInfo;
/*
* Returns a pointer to the slow version for a procedure
* whose signature is p.
*/
/* the function definition is - */
static void (*get_proc_slow(CilkProcInfo *p)) () {
return p[0].inlet;
}
/*The function gets called as -*/
(get_proc_slow(f->sig)) (ws, f);
/*where f->sig is a pointer to CilkProcInfo struct*/
解決
CilkProcInfo
構造体では、 inlet
は、不特定の数の引数を取り、値を返さない関数へのポインタです。 void foo();
のように。
行内
(get_proc_slow(f->sig)) (ws, f);
get_proc_slow(f-> sig)
呼び出しはこの関数ポインターを返すため、これは次と同等です
(f->sig[0].inlet) (ws, f);
したがって、 f-> sig [0] .inlet
が関数 foo()
を指す場合、呼び出しと同等です
foo (ws, f);
static void(* get_proc_slow(CilkProcInfo * p))(){...
構文は少し馴染みがないことを認めるべきです。
他のヒント
get_proc_slow()は、コードが呼び出すvoid(*)()型の関数ポインターを返します。その場合:
(get_proc_slow(f->sig)) (ws, f);
基本的には次と同じです:
void (*fptr)() = get_proc_slow(f->sig);
fptr(ws, f);
パラメータを持たない( void(*)()
)戻り値が void
である関数へのポインタを返す関数のように見えます。パラメーターとしての CilkProcInfo struct
へのポインター。しかし、なぜ p [0] .inlet
コンストラクトが必要なのかわかりません。単に p-> inlet
として返せませんか?
ああ、 get_proc_slow
は、上記の関数ポインターを返す関数の名前です。
static void (*get_proc_slow(CilkProcInfo *p)) () {
return p[0].inlet;
}
名前から読み取り、文法規則に注意してください: get_proc_slow
は、 CilkProcInfo
構造体へのポインターを取り、未指定の引数を取り、値を返さない関数へのポインター( void
)。
(get_proc_slow(f->sig)) (ws, f);
このステートメントは、適切なパラメーター( f-> sig
は CilkProcInfo
へのポインター)で get_proc_slow
を呼び出してから、 ws
および f
を引数としてその関数を呼び出すための戻り値(関数へのポインター)。