Вопрос

Скажите, пожалуйста, что вернет вызов данной функции и как? Код:

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 в качестве аргументов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top