C - Странный аргумент прототипа - PullRequest
1 голос
/ 30 сентября 2011

Что происходит в этом прототипе функции?Очевидно, что параметр void с какой-то типизацией приводит в замешательство ...

int *my_func(my_struct *m, void (*m_op)(my_struct *v, void arg));

Ответы [ 4 ]

10 голосов
/ 30 сентября 2011

Второй аргумент функции my_func является указателем на функцию, которая не возвращает значения (void), но принимает два аргумента: указатель my_struct и ... и (недопустимый) void.Последний, вероятно, должен быть void *arg;вы не можете иметь переменную или аргумент типа void.Как он есть, код не должен компилироваться.

1 голос
/ 30 сентября 2011

Этот прототип объявляет функцию my_func, которая возвращает int *.Он принимает два аргумента: первый тип my_struct *, а второй странного типа void (*)(my_struct *, void).Это означает, что второй аргумент является указателем на функцию, которая возвращает void и сама принимает 2 аргумента, указатель на my_struct и void (я предполагаю, что это была опечатка, и она принимает void *).

0 голосов
/ 30 сентября 2011

Эта небольшая статья объясняет, как анализировать объявления C по спирали. Построение производится в обратном порядке.

0 голосов
/ 30 сентября 2011

Мое предложение - всегда пытайтесь разбить объявления на более мелкие - в этом случае код будет более читабельным.В этом случае вы можете переписать код следующим образом:

typedef struct {} my_struct;

typedef void (* m_op_function)(my_struct * v, void * arg);

int * my_func(my_struct * m, m_op_function f);

И, как все говорили, здесь почти 99,99% опечаток в отношении второго параметра m_op_function - это возможно void* - так что вы можетепередать любой указатель на него - будь то (char*), (int*), (my_struct*) или что-нибудь еще.Просто наведите указатель.

...