Сомнительный указатель на функцию
-
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
вход
является указателем на функцию, которая принимает неопределенное количество аргументов и не возвращает значение, как 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
в качестве параметра. Я не уверен, зачем вам нужна конструкция p [0] .inlet
. Не могли бы вы просто вернуть его как p-> glet; 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);
Этот оператор вызывает get_proc_slow
с соответствующим параметром ( f- > sig
является указателем на CilkProcInfo
), а затем использует возвращаемое значение (указатель на функцию) для вызова этой функции с ws
и f
в качестве аргументов.