Сомнительный указатель на функцию - PullRequest
2 голосов
/ 28 октября 2009

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

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*/

Ответы [ 4 ]

5 голосов
/ 28 октября 2009

В вашей структуре 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)) () {... мне немного незнаком.

1 голос
/ 28 октября 2009

get_proc_slow () возвращает указатель на функцию типа void (*) (), которую затем вызывает код. Итак, когда вы делаете:

(get_proc_slow(f->sig)) (ws, f);

Это в основном то же самое, что и:

void (*fptr)() = get_proc_slow(f->sig);
fptr(ws, f);
0 голосов
/ 28 октября 2009
static void (*get_proc_slow(CilkProcInfo *p)) () {
     return p[0].inlet;
}

Чтение из имени, соблюдение правил грамматики: get_proc_slow - это функция (с внутренней связью), которая берет указатель на структуру CilkProcInfo и возвращает указатель на функцию, принимающую неуказанные аргументы и возвращающую no значение (void).

(get_proc_slow(f->sig)) (ws, f);

Этот оператор вызывает get_proc_slow с соответствующим параметром (f->sig - указатель на CilkProcInfo), а затем использует возвращаемое значение (указатель на функцию) для вызова этой функции с ws и f в качестве аргументов.

0 голосов
/ 28 октября 2009

Похоже, что это функция, которая возвращает указатель на функцию с возвращаемым значением void, которая не имеет параметров (void(*)()) и которая принимает указатель на CilkProcInfo struct в качестве параметра. Я не уверен, зачем вам нужна конструкция p[0].inlet. Не могли бы вы просто вернуть его как p->inlet?

Да, а get_proc_slow - это имя функции, которая возвращает указатель на указанную функцию.

...