Объяснить void (* сигнал (int signo, void * (func) (int))) (int) - PullRequest
5 голосов
/ 16 февраля 2010

Пожалуйста, объясните этот тип подписи: void (*signal(int signo, void *(func)(int)))(int)

Ответы [ 2 ]

17 голосов
/ 16 февраля 2010

Сигнатура типа функции signal становится немного более понятной, если для передаваемых указателей на функции используется typedef:

typedef void (*sighandler_t)(int);
sighandler_t signal(int signo, sighandler_t func);

sighandler_t - указатель на функцию, которая принимает параметр int и ничего не возвращает. Функция signal принимает такой указатель функции в качестве второго параметра. Он также возвращает указатель на функцию этого типа.

1 голос
/ 22 марта 2014

C декларации должны быть прочитаны изнутри. Сложная часть со сложными объявлениями функций состоит в том, чтобы выяснить, кто является самым внутренним декларатором (с чего начать). Обычно это первый идентификатор, который не является идентификатором типа. Так что в этом случае:

void (*signal(int signo, void *(func)(int)))(int)

декларатор signal. Внутри скобок суффиксы имеют более высокий приоритет, чем префиксы, поэтому signal - это функция, принимающая два аргумента (часть (int signo, void *(func)(int))), которая возвращает указатель (префикс *) на функцию, принимающую один аргумент int ( (int) в конце) и возвращая void

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...